用PyQtGraph绘制可视化数据图表
Posted la_vie_est_belle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用PyQtGraph绘制可视化数据图表相关的知识,希望对你有一定的参考价值。
第三十六章 用PyQtGraph绘制可视化数据图表
如果要用Python来绘制图表的话,我们可能首先会想到用Matplotlib这个库。虽然PyQtGraph还没有像Matplotlib那样成熟,但是当数据量非常大的时候,PyQtGraph的处理速度是Matplotlib所不能比的。而且如果你已经对PyQt5有所了解的话,那PyQtGraph绝对是图表绘制的最佳选择(PyQtGraph是基于Qt和NumPy开发的)。
作为一种强大的绘图库,PyQtGraph在数学、科学和工程领域都有着广泛的应用,那本章我们就来学习下如何使用它。
36.1 下载PyQtGraph
Windows上下载:
pip install pyqtgraph
Linux上下载:
pip3 install pyqtgraph
MacOS上下载:
pip3 install pyqtgraph
下载完毕后我们可以运行以下代码:
import pyqtgraph.examples
pyqtgraph.examples.run()
之后就会显示PyQtGraph库所提供的的一些官方示例(左边为示例名称,右边为代码):
双击左边的任一示例,即可显示相应的界面,比如我们这里双击第二个"Basic Plotting"来显示一个图表合集:
36.2 基础知识与用法
在本小节中,我们会来了解下PyQtGraph中一些基础知识与常见的用法。
全局设置
参数 | 类型 | 默认值 | 解释 |
leftButtonPan | bool | True | 值为True的话,可以用鼠标左键来上下左右拖动图表;若为False,拖动鼠标左键会形成一个矩形框,视图镜头会随之深入 |
foreground | 参考 mkColor() | ‘d’ | 设置前景颜色(包括文本、线条、坐标轴等),'d'为灰色 |
background | 参考 mkColor() | ‘k’ | 设置背景颜色,'k'为黑色 |
antialias | bool | False | 是否启用抗锯齿(可以让曲线更加光滑) |
useOpenGL | bool | False | 是否在视图中启用OpenGL |
crashWarning | bool | False | 则会打印针对可能导致程序崩溃情况的警告 |
PyQtGraph提供了两种类似的方法来进行全局设置:
pyqtgraph.setConfigOptions(**opts) # 同时设置多项参数
pyqtgraph.getConfigOption(opt) # 只设置一项参数
我们可以这么使用:
# 禁止拖动图表,并启用抗锯齿
pyqtgraph.setConfigOptions(leftButtonPan=False, antialias=True)
# 禁止拖动图表
pyqtgraph.getConfigOption('leftButtonPan', True)
pyqtgraph.plot()和PlotWidget.plot()
以上两个方法都是用来绘图的,区别如下:
pyqtgraph.plot() | 在一个新窗口中绘制数据(窗口中包含一个plotWidget) |
PlotWidget.plot() | 在plotWidget控件中绘制数据 |
可见,如果要将PyQtGraph嵌入PyQt5窗口中的话(也就是将控件添加到窗口中),应该使用PlotWidget.plot()。
plot()方法的基本参数如下:
- x - X轴数据(可选)。如果没有赋值的话,程序则自动生成特定范围的整数值
- y - Y轴数据
- pen - 图表线条的画笔参数,若设为None则不显示线条
- symbol - 参数为字符串类型,用于描述图表每个坐标点的形状。比如设为'o',则坐标点的形状就为o。可选值总共有这么几种:'o', 's', 't', 't1', 't2', 't3','d', '+', 'x', 'p', 'h', 'star'
- symbolPen - 描绘符号轮廓的画笔参数
- symbolBrush - 填充符号的画刷参数
- fillLevel - 用于计算曲线下面积的Y坐标值
- brush - 用于填充曲线下面积的画刷
示例代码:
# 指定y坐标轴上的值,线条画笔为红色,坐标点符号为'o'
PlotWidget.plot([1, 2, 3, 4, 5], pen='r', symbol='o')
运行截图(可以看到x轴坐标是自动生成的):
颜色,画笔和画刷
PyQt5提供了QColor,QPen和QBrush类用于描绘线条与填充颜色,而在PyQtGraph中,我们可以使用mkColor(),mkPen()以及mkBrush()方法来实例化相应的对象。
我们可以给传参给mkColor()方法来实例化一个QColor颜色对象,可传参数类型有:
‘c’ | r, g, b, c, m, y, k, w中的一种 |
R, G, B, [A] | 整数0-255 |
(R, G, B, [A]) | 整数元组0-255 |
float | 灰度值0.0-1.0 |
“RGB” | 十六进制字符串,可以在前面加# |
“RGBA” | 同上 |
“RRGGBB” | 同上 |
“RRGGBBAA” | 同上 |
QColor | QColor实例 |
第一行中的单个字符串所对应的值如下:
'b': QtGui.QColor(0,0,255,255)
'g': QtGui.QColor(0,255,0,255)
'r': QtGui.QColor(255,0,0,255)
'c': QtGui.QColor(0,255,255,255)
'm': QtGui.QColor(255,0,255,255)
'y': QtGui.QColor(255,255,0,255)
'k': QtGui.QColor(0,0,0,255)
'w': QtGui.QColor(255,255,255,255)
'd': QtGui.QColor(150,150,150,255)
'l': QtGui.QColor(200,200,200,255)
's': QtGui.QColor(100,100,150,255)
颜色对象主要用于画笔和画刷,而这两者的设置非常简单:
mkPen('r')
mkPen(255, 255, 255)
mkPen((255, 255, 255, 255))
mkPen('#0000FF')
mkPen(QColor)
准确来说,能被mkColor()接受的参数都能用在mkPen()中。除了颜色我们还可以设置画笔粗细:
mkPen(color='r', width=2)
mkPen('color': '#0000FF', width: 2)
如果不想设置画笔,我们可以传入None:
mkPen(None)
画刷设置同理,可以接受所有能被mkColor()接受的参数。可传入None不设置画刷。
36.3 将PyQtGraph嵌入到PyQt5中
将PyQtGraph所绘制的图表和PyQt5结合是最终目的,请看下方代码:
import sys
import random
import numpy as np
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600)
# 1
pg.setConfigOptions(leftButtonPan=False)
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')
# 2
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3','d', '+', 'x', 'p', 'h', 'star'])
r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])
# 3
self.pw = pg.PlotWidget(self)
self.plot_data = self.pw.plot(x, y, pen=None, symbol=r_symbol, symbolBrush=r_color)
# 4
self.plot_btn = QPushButton('Replot', self)
self.plot_btn.clicked.connect(self.plot_slot)
self.v_layout = QVBoxLayout()
self.v_layout.addWidget(self.pw)
self.v_layout.addWidget(self.plot_btn)
self.setLayout(self.v_layout)
def plot_slot(self):
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3', 'd', '+', 'x', 'p', 'h', 'star'])
r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])
self.plot_data.setData(x, y, pen=None, symbol=r_symbol, symbolBrush=r_color)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
1. 进行全局设置:禁止拖动、前景色为黑色、背景色为白色;
2. 利用NumPy库生成高斯分布的概率密度随机数作为x轴和y轴坐标数据,并随机挑选符号以及颜色;
3. 实例化一个PlotWidget对象并绘制图表:无画笔、坐标点符号为'o'、符号画刷颜色为绿色。返回一个PlotDataItem对象存储在self.new_plot变量中(该对象就是图表上的数据整体);
4. 按钮用于重新绘制数据,在槽函数中调用setData()方法重新设置数据(如果我们在槽函数中调用self.pw.plot()的话,那新数据就会被重叠绘制到旧数据上)。
运行截图如下:
点击按钮重绘(数据,颜色和符号都改变):
用鼠标左键在指定位置拖出一个矩形对数据深入观察:
如果想要导出图像的话,我们可以点击右键,选择export,之后就会出现一个导出选项框:
我们可以选择导出为图片、SVG文件、CSV文件或者重新在Matplotlib中进行绘制。选择导出格式后,我们可以在Export options框中进行相应的设置(笔者这里就直接选择导出为png格式的图片了),设置好后点击Export按钮则会出现一个文件保存对话框:
点击Save按钮保存图片,此时可能会出现以下报错:
报错显示在ImageExporter.py文件中的第70行,我们根据报错内容直接将这行代码修改如下(将float类型转换为int类型):
bg = np.empty((int(self.params['width']), int(self.params['height']), 4), dtype=np.ubyte)
现在已经可以成功导出:
36.4 小结
1. 从官方示例可以看出,PyQtGraph中内置一些Qt模块,所以如果功能不是非常复杂的话,可以单单使用PyQtGraph实现。可以在这里看到PyQtGraph提供的一些控件;
2. 大家可以自己尝试写一个跟股票相关的软件,其中用爬虫爬取数据,用PyQtGraph做K线图;
3. 如果读者想要显示3D图像的话,笔者建议可以使用PyOpenGL这个库来搭配PyQt5中的QGLWidget;
4. 如果要了解更多关于PyQtGraph的内容,大家可以通过它的官方文档来进一步学习。
欢迎关注我的微信公众号,发现更多有趣内容:
以上是关于用PyQtGraph绘制可视化数据图表的主要内容,如果未能解决你的问题,请参考以下文章