【PyQt5】PyQtChart二维绘图

1.概述
PyQtChart是Qt Charts模块的Python绑定,它需要单独安装。绘制各种常见的二维图表,如折线图、柱状图、饼图、散点图、极坐标图等。

安装PyQtChart,只需在Windows的cmd窗口里执行下面的命令即可。

pip3 install PyQtChart

PyQtChart安装后的类都在PyQt5.QtChart模块中,所以程序中要使用其中的类时,import语句示例如下:

from PyQt5.QtChart import QChartView,QChart,QLineSeries,QValueAxis

2.主要类
PyQtChart模块包括一组易于使用的图表操作类,它基于Qt的Graphics View架构,其核心组件是QChartView和QChart。

(1)QChartView的父类是QGraphicsView,就是Graphics View架构中的视图类,所以,QChartView是用于显示图表的视图。先放置一个QGraphicsView组件,然后提升为QChartView。QChartView类定义的函数很少,只有以下几个。

setChart(chart)函数,设置一个QChart对象chart作为显示的图表。
chart()函数,返回QChartView当前的QChart类对象。
setRubberBand(rubberBand)函数,设置选择框的类型,即鼠标在视图组件上拖动选择范围的方式,参数rubberBand是一个QChartView.RubberBand枚举类型的组合,枚举类型有以下几种取值:
QChartView.NoRubberBand(无选择框);
QChartView.VerticalRubberBand(垂直选择);
QChartView.HorizontalRubberBand(水平选择);
QChartView.RectangleRubberBand(矩形框选择)。
rubberBand()函数,返回设置的选择框类型。

(2)QChart的继承关系如图所示,可以看到QChart是从QGraphicsItem继承而来的,所以,QChart是一种图形项。QPolarChart是用于绘制极坐标图的图表类,它从QChart继承而来。

QChart的继承关系:
在这里插入图片描述
(3)序列:图表的类型主要就是由序列的类型决定的,常见的图表类型有折线图、柱状图、饼图、散点图等,PyQtChart模块中的序列类的层次关系如图所示。QAbstractSeries类是所有这些类的上层类,QAbstractSeries的父类是QObject,所以这些序列类并不是可视组件,只是用于管理各种类型序列的数据的类。
【PyQt5】PyQtChart二维绘图_第1张图片
这些序列类可以分为以下几组。
(1)从QXYSeries继承的曲线和散点类
QLineSeries折线序列:两个数据点之间直接用直线连接的序列,用于一般的曲线显示,Demo12_1是这种类型。
QSplineSeries曲线序列:数据点的连线会做光滑处理的曲线序列。
QScatterSeries散点序列:只显示数据点的序列。
(2)从QAbstractBarSeries继承的各种柱状图类
QBarSeries和QHorizontalBarSeries:常见的柱状图序列。
QStackedBarSeries和QHorizontalStackedBarSeries:堆叠柱状图序列。
QPercentBarSeries和QHorizontalPercentBarSeries:百分比柱状图序列。
(3)从QAbstractSeries直接继承的特殊序列类
QPieSeries饼图序列。
QCandlestickSeries蜡烛图序列:可绘制常用于金融数据分析的蜡烛图。
QBoxPlotSeries箱线图序列:用于金融数据分析的一种图形。
QAreaSeries面积图序列:用两个QLineSeries序列曲线作为上界和下界绘制填充的面积图。

坐标轴:坐标轴用QValueAxis类的数值坐标轴,如果用对数坐标,就可以使用QLogValueAxis类的坐标轴。柱状图的横坐标经常是文字表示的类别,可以用QBarCategoryAxis作为横轴,而饼图没有坐标轴。
PyQtChart中的坐标轴类如下:
QValueAxis数值坐标轴:作为数值型数据的坐标轴
QCategoryAxis分组数值坐标轴:可以为数值范围设置文字标签
QLogValueAxis对数数值坐标轴:作为数值型数据的对数坐标轴,可以设置对数的基。
QBarCategoryAxis类别坐标轴:用字符串作为坐标轴的刻度,用于图表的非数值坐标轴。
QDateTimeAxis日期时间坐标轴:作为日期时间数据的坐标轴
【PyQt5】PyQtChart二维绘图_第2张图片
QAbstractAxis类的父类是QObject,所以坐标轴类不是可见的组件类,只是用于封装坐标轴相关的各种数据和属性,如坐标轴的刻度、标签、网格线、标题等属性。

图例(Legend):QLegend是封装了图例功能的类,在QChart对象添加序列后会自动生成图例,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上、下、左、右的不同位置。

3.详细代码
用纯代码的方式创建一个基于QMainWindow的GUI应用程序,并用PyQtChart模块中的几个主要的类绘制了一个简单的图表。myMainWindow.py文件的完整代码如下:

import sys, math
from PyQt5.QtWidgets import  QApplication, QMainWindow
from PyQt5.QtChart import QChartView,QChart,QLineSeries,QValueAxis

class QmyMainWindow(QMainWindow): 
   def __init__(self, parent=None):
      super().__init__(parent)
      self.setWindowTitle("Demo12_1, QChart基本绘图")
      self.resize(580,420)
##创建chart和chartView
      chart = QChart()               #创建 chart
      chart.setTitle("简单函数曲线")
      chartView=QChartView(self)     #创建 chartView
      chartView.setChart(chart)      #chart添加到chartView
      self.setCentralWidget(chartView)
##创建曲线序列
      series0 = QLineSeries()
      series1 = QLineSeries()
      series0.setName("Sin曲线")
      series1.setName("Cos曲线")
      chart.addSeries(series0)       #序列添加到图表
      chart.addSeries(series1)
##序列添加数值
      t=0
      intv=0.1
      pointCount=100
      for i in range(pointCount):
         y1=math.cos(t) 
         series0.append(t,y1)
         y2=1.5*math.sin(t+20)
         series1.append(t,y2)
         t=t+intv
##创建坐标轴
      axisX = QValueAxis()      #x轴
      axisX.setRange(0, 10)     #设置坐标轴范围
      axisX.setTitleText("time(secs)")    #轴标题
      axisY = QValueAxis()      #y轴
      axisY.setRange(-2, 2)
      axisY.setTitleText("value")
##为序列设置坐标轴
      chart.setAxisX(axisX, series0)    #为序列series0设置坐标轴
      chart.setAxisY(axisY, series0)
      chart.setAxisX(axisX, series1)    #为序列series1设置坐标轴
      chart.setAxisY(axisY, series1)

##  ============窗体测试程序 ============================
if  __name__ == "__main__": 
   app = QApplication(sys.argv)
   form = QmyMainWindow() 
   form.show()
   sys.exit(app.exec_())

(1)首先创建一个QChart对象chart和一个QChartView对象chartView,将chart在chartView里显示。
用到了QChartView中的setChart(QChart)函数。

(2)图表上用于显示数据的称为序列(series),这里使用折线序列QLineSeries,创建了两个QLineSeries类型的序列series0和series1,并将序列添加到chart中。QChart使用addSeries(QLineSeries)函数。

(3)序列存储用于显示的数据,所以需要为两个序列添加平面数据点的坐标数据。程序中用正弦函数和余弦函数生成数据作为序列的数据。QLineSeries用到了append()函数。

(4)图表还需要坐标轴,创建两个QValueAxis类型的坐标轴对象axisX和axisY,再使用QChart的setAxisX()和setAxisY()函数为两个序列分别设置x 轴和y 轴。

图表创建后还会自动生成图例(Legend),图例是与序列对应的。
【PyQt5】PyQtChart二维绘图_第3张图片
图表的主要组成部分:QChartView是QChart的视图组件,而一个QChart绘制的图表一般包括序列、坐标轴、图例、图表标题等部分。

你可能感兴趣的:(笔记,PyQt,GUI,qt,python,开发语言,ui)