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,所以这些序列类并不是可视组件,只是用于管理各种类型序列的数据的类。
这些序列类可以分为以下几组。
(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日期时间坐标轴:作为日期时间数据的坐标轴
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),图例是与序列对应的。
图表的主要组成部分:QChartView是QChart的视图组件,而一个QChart绘制的图表一般包括序列、坐标轴、图例、图表标题等部分。