实战PyQt5: 155-QChart图表之极坐标图表

在前面的图表中,我们使用的坐标系都是直角坐标系(也称笛卡尔坐标系), 但是有些数据序列,使用极坐标系来显示更合理(比如常见的雷达图)。QChart中,提供QPolarChart来实现用极坐标系显示的图表。

QPolarChart

QPolarChart在极坐标图中显示数据。极坐标图在圆形图中显示数据,其数据基于图形中心极点的距离和与水平方向的夹角来确定。

QChart中的极坐标支持折线,样条曲线,面积和散点图表序列,它也支持所有的轴类型,而且每个轴多可以作为径向轴(radial axis)或者角度轴(angular axis)。

在极坐标系中,角度轴QValueAxis上的第一个和最后一个刻度线位于0/360度处。

如果图表数据序列中两个连续点之间的角距离大于180度,则连接两个点的任何直线将变得毫无意义,因此将不会绘制。而是会在图表的中心绘制一条线。因此,在显示直线,样条曲线或区域序列时,必须相应地选择轴范围。

极坐标图在相同位置绘制相同方向的所有轴,因此使用多个相同方向的轴可能会造成混淆,除非多余的轴仅用于自定义网格。例如,可以显示带有辅助阴影的QCategoryAxis的突出显示范围,或提供带有辅助QValueAxis的未标记子刻度等。

QPolarChart常用函数:

  • addAxis(self, axis, polarOrientation): 将坐标轴axis添加到极性方向由polarOrientation指定的极坐标图中。图表将获得坐标轴的所有权。polarOrientation有两个取值:径向轴QPolarChart.PolarOrientationRadial和角度轴QPolarChart.PolarOrientationAngular。
  • axis(self, polarOrientation, series): 返回极性为polarOrientation的series图表数据序列添加的轴。如果未提供任何图表数据序列,则将返回具有指定极坐标方向的任何轴。

极坐标图示例

示例显示了如何创建具有多个不同系列的简单极坐标图。显示了如何实现极坐标图的滚动和缩放,以及直观地展示了极坐标图和笛卡尔图如何相互关联。完整代码如下:

import sys
from PyQt5.QtCore import Qt, QPointF
from PyQt5.QtGui import QPainter, QBrush, QColor
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView
from PyQt5.QtChart import (QChart, QChartView, QPolarChart, QScatterSeries, QSplineSeries, QLineSeries, QAreaSeries, QValueAxis)class MyChartView(QChartView):def __init__(self, parent = None):super(MyChartView, self).__init__(parent)def keyPressEvent(self, event):if event.key() == Qt.Key_Plus:self.chart().zoomIn()elif event.key() == Qt.Key_Minus:self.chart().zoomOut()elif event.key() == Qt.Key_Left:self.chart().scroll(-1.0, 0)elif event.key() == Qt.Key_Right:self.chart().scroll(1.0, 0)elif event.key() == Qt.Key_Up:self.chart().scroll(0, 1.0)elif event.key() == Qt.Key_Down:self.chart().scroll(0, -1.0)elif event.key() == Qt.Key_Space:self.switchChartType()else:QGraphicsView.keyPressEvent(self, event)def switchChartType(self):oldChart = self.chart()if oldChart.chartType() == QChart.ChartTypeCartesian:newChart = QPolarChart()else:newChart = QChart()axisRanges = []#将图表序列和轴从旧图表移动到新图表seriesList = oldChart.series()axisList = oldChart.axes()for axis in axisList:axisRanges.append(QPointF(axis.min(), axis.max()))for series in seriesList:oldChart.removeSeries(series)for axis in axisList:oldChart.removeAxis(axis)align = axis.alignment()#bug fixif oldChart.chartType() == QChart.ChartTypeCartesian:if align == Qt.AlignBottom:align = QPolarChart.PolarOrientationAngularelse:align = QPolarChart.PolarOrientationRadialnewChart.addAxis(axis, align)for series in seriesList:newChart.addSeries(series)for axis in axisList:series.attachAxis(axis)for index, axis in enumerate(axisList):axis.setRange(axisRanges[index].x(), axisRanges[index].y())newChart.setTitle(oldChart.title())self.setChart(newChart)del oldChartclass DemoPolarChart(QMainWindow):def __init__(self, parent=None):super(DemoPolarChart, self).__init__(parent)   # 设置窗口标题self.setWindowTitle('实战 Qt for Python: 极坐标演示')      # 设置窗口大小self.resize(640, 480)self.createChart()def createChart(self):angularMin = -100angularMax = 100radialMin = -100radialMax = 100series1 = QScatterSeries()series1.setName('散点图')for i in range(angularMin, angularMax, 10):series1.append(i, (i / radialMax) * radialMax + 8.0)series2 = QSplineSeries()series2.setName('样条曲线') for i in range(angularMin, angularMax, 10):series2.append(i, (i / radialMax) * radialMax)series3 = QLineSeries()series3.setName('星星外边界线')ad = (angularMax - angularMin) / 8rd = (radialMax - radialMin) / 3 * 1.3series3.append(angularMin, radialMax)series3.append(angularMin + ad*1, radialMin + rd)series3.append(angularMin + ad*2, radialMax)series3.append(angularMin + ad*3, radialMin + rd)series3.append(angularMin + ad*4, radialMax)series3.append(angularMin + ad*5, radialMin + rd)series3.append(angularMin + ad*6, radialMax)series3.append(angularMin + ad*7, radialMin + rd)series3.append(angularMin + ad*8, radialMax) series4 = QLineSeries()series4.setName('星星内边界线')ad = (angularMax - angularMin) / 8rd = (radialMax - radialMin) / 3series4.append(angularMin, radialMax)series4.append(angularMin + ad*1, radialMin + rd)series4.append(angularMin + ad*2, radialMax)series4.append(angularMin + ad*3, radialMin + rd)series4.append(angularMin + ad*4, radialMax)series4.append(angularMin + ad*5, radialMin + rd)series4.append(angularMin + ad*6, radialMax)series4.append(angularMin + ad*7, radialMin + rd)series4.append(angularMin + ad*8, radialMax)series5 = QAreaSeries()series5.setName('星星区域')series5.setUpperSeries(series3)series5.setLowerSeries(series4)series5.setOpacity(0.5)#创建图表chart = QPolarChart()chart.addSeries(series1)chart.addSeries(series2)chart.addSeries(series3)chart.addSeries(series4)chart.addSeries(series5)chart.setTitle('使用箭头键可以滚动,使用+/-键可以缩放,使用空格键可以切换图表类型.')angularAxis = QValueAxis()angularAxis.setTickCount(9) #第一个和最后一个刻度在0/360角度上同一位置angularAxis.setLabelFormat('%.1f')angularAxis.setShadesVisible(True)angularAxis.setShadesBrush(QBrush(QColor(249, 249, 255)))chart.addAxis(angularAxis, QPolarChart.PolarOrientationAngular)radialAxis = QValueAxis()radialAxis.setTickCount(9)radialAxis.setLabelFormat('%d')chart.addAxis(radialAxis, QPolarChart.PolarOrientationRadial)series1.attachAxis(radialAxis)series1.attachAxis(angularAxis)series2.attachAxis(radialAxis)series2.attachAxis(angularAxis)series3.attachAxis(radialAxis)series3.attachAxis(angularAxis)series4.attachAxis(radialAxis)series4.attachAxis(angularAxis)series5.attachAxis(radialAxis)series5.attachAxis(angularAxis)radialAxis.setRange(radialMin, radialMax)angularAxis.setRange(angularMin, angularMax)#图表视图chartView = MyChartView()chartView.setChart(chart)chartView.setRenderHint(QPainter.Antialiasing)self.setCentralWidget(chartView)if __name__ == '__main__':app = QApplication(sys.argv)window = DemoPolarChart()window.show()sys.exit(app.exec())   

运行结果如下图:

 QChart极坐标系演示

本文知识点

  • 极坐标系基本概念。
  • 使用极坐标系绘制几种基本图标序列。

前一篇: 实战PyQt5: 154-QChart图表之多坐标轴图表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57680.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022-04-22 工作记录--Highcharts-图表点击事件 + 图例点击事件 + 图例格式化后的回调

Highcharts-图表点击事件 图例点击事件 图例格式化后的回调 一、前言 看似很简单的问题,其实里面有很多细节,所以做个笔记哟~❀ 如下图:上面是图表,下面是图例哟☺️ 二、官方文档 https://www.highcharts.com.cn/docs 三、…

XCL-Charts图表库简要教程及常见问题

这个Andriod图表库项目从开始至现在,热情消耗几近殆尽。还好已基本实现我想做的那些东西。趁还剩下点兴趣,把一些点非常简单的归纳一下。 所支持的图表类型: 基类 图表名称 BarChart 横/竖向柱形图及背向式柱…

使用Google Chart API 创建实时图表

实时图表可以实时显示数据。这意味着数据将永久更新以始终显示当前图表。要创建实时图表,我们使用JavaScript和Google Chart API。 这些实时图表通常用于仪表板中,以显示例如温度或价格的变化情况。应用领域多样,它们看起来确实不错。你自己看…

利用ARCGIS实现图片与excel中坐标点的匹配并绘图

一、背景 本次的实验完成的是坐标点文件与图片的匹配,已有的数据分别是点的坐标excel文件以及区域图片,来实现区域的绘制。 二、步骤 1、首先将坐标点excel文件导入ARCGIS中进行展点,数据的格式如下: 2、点击ARCGIS界面中的文件…

chatgpt赋能Python-python_plot坐标轴

Python绘图库中坐标轴的设置 介绍 Python是一种简单易学,功能强大的编程语言。它被广泛用于数据科学和可视化领域。Python绘图库中的坐标轴设置可以让我们更好地展示数据,让我们更轻松地理解数据。本篇文章将介绍Python绘图库中坐标轴设置的方法和技巧…

Unity数据可视化图表插件XCharts(折线图、柱状图、饼图、雷达图、散点图、热力图、热力图、仪表盘、环形图、极坐标、水位图等等)

文章目录 一、前言二、Unity数据可视化图表插件:XCharts1、运行效果2、文档教程 三、结束语 一、前言 点关注不迷路,持续输出Unity干货文章。 嗨,大家好,我是新发。 今天,我在GitHub上看到一个屌炸天的Unity插件&…

pyecharts0.5.x制作含地图的数据看板

引言 pyecharts作为Python的数据可视化包,其强大的功能不言而喻,Python Echart,想想就觉得牛叉。目前pyecharts有两个大的版本,一个是0.5.x版本的,一个是1.0以后版本,而且这两个版本差别很大。如果是有的…

antv/g2图表tooltip自定义并展示坐标之外的数据

首先使用itemTpl自定义tooltip 效果是这样的tooltip展示坐标之外的数据 感觉Antv文档很不详细,写这块时找了好久才找到方法,现在记一下,方便今后的观看和其他遇到此问题的同学解决办法。 itemTpl this.chart.tooltip({showCrosshairs: true,…

pyecharts源码解读(13)图表类包charts之组合图表:直角坐标系(网格布局)Grid

当前pyecharts的版本为1.9.0。 概述 pyecharts/charts/composite_charts/包中的四个模块分别定义了组合图表类,其中pyecharts/charts/composite_charts/grid.py模块只定义了网格布局类Grid。 Grid类继承自图表基类Base,作用为在一个echarts实例中利用…

宇宙中大数字

1、高德纳箭头 2、葛力函数 如果脑子里面装一个葛里恒数,脑子就成了黑洞了。 后来人们研究出tree3

CCF-CSP 小中大 C语言

时间限制&#xff1a;0.1s 空间限制&#xff1a;512.0MB #include<stdio.h> int main() { int n,max,min,mid,midd,i; scanf("%d",&n); int a[n]; for(i0;i<n;i) {scanf("%d",&a[i]);} //输入 if(a[0]>a[n-1]){maxa[0];mina[n-1];} e…

redis中大Value问题的解决

我们日常在使用redis的时候, 有时会碰到大Value的问题, 超级大的一个Value存到redis中去, 这样其实不好, 我们可以把value进行压缩. 下面我们使用java自带的压缩, 对字符串进行压缩. /*** 使用gzip压缩字符串** param originString 要压缩的字符串* return 压缩后的字符串*/…

java中大素数生成算法

目前的公开密钥 算法大部分基于大整数分解、有限域上的离散对数问题和椭 圆曲线上的离散对数问题&#xff0c;这些数学难题的构建大部分都需 要生成一种超大的素数&#xff0c;尤其在经典的RSA算法中&#xff0c;生成的素数的质量对系统的安全性有很大的影响。 1.原理 费马小…

解决js中大数的问题

大数的理解: 就是由于数字太大了,然后js解析不了,不认识. 就比如实际生活中,在双11的时候,我们知道淘宝一夜之间总购买量肯定是一个很大很大的金额,当我们前端碰到一个非常大的数字的时候,js可能会解析不了. JS中的安全数字: > Number.MAX_SAFE_INTEGER 可以查看js中的…

CSP 201903-1 小中大

题目链接&#xff1a; 计算机软件能力认证考试系统http://118.190.20.162/view.page?gpidT89 【分析】主要学一下java的四舍五入&#xff0c;String,format("%.f", double&#xff09;&#xff1b; import java.util.Arrays; import java.util.Scanner;public cla…

CSP:小中大

试题编号&#xff1a;201903-1 试题名称&#xff1a;小中大 时间限制&#xff1a;1.0s 内存限制&#xff1a;512.0MB 思路&#xff1a;题目很简单&#xff0c;依次输出最大值&#xff0c;中位数&#xff0c;最小值。输出中位数的时候很神奇的出错。。。费了好半天事才改对。…

ccf小中大

试题编号&#xff1a;201903-1试题名称&#xff1a;小中大时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 思路很简单&#xff0c;但是有很多细节要考虑 如果中位数是小数&#xff0c;则要四舍五入&#xff0c;保留一位小数 否则直接输出整…

Spring中大事务拆分方案

Spring中大事务拆分方案 模块设计的时序图 启动流程 激活事件 完成事件 长事务造成的影响 由于现在事件的完成及后续激活都在一个事务中&#xff0c;比如完成融资申请事件之后会去激活批次启动签约&#xff0c;前置协议&#xff0c;资质认证等事件&#xff0c;这些操作…

AI 将完全取代前端开发吗?

注&#xff1a;今晨&#xff0c;我浏览 Medium&#xff0c;看到了篇颇为标题党的文章&#xff0c;于是我就将它抛给了 ChatGPT。本篇文章全部由 ChatGPT 所写。同时&#xff0c;我也请 ChatGPT 分享了它对此的观点。 最近&#xff0c;我的同事向我讲述了他与他老板的一次谈话。…

全网多种方法解决未连接到互联网 代理服务器出现问题,或者地址有误的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法5. 补充说明 1. 复现错误 今天&#xff0c;单位的实习生准备下载公司的代码&#xff0c;由于公司的代码放在gitlab上&#xff0c;需要内网才能登录gitlab。 而登陆内网需借助Hillstone Secure Connect&…