9个动图带你进入PyQtGraph的强大可视化世界
基础的数组绘制折线图
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 使用addPlot()方法直接添加一个数组以绘制图形 p1 = win.addPlot(title="基础数组绘图", y=np.random.normal(size=100)) if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
一个图形中绘制多条折线
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 p2 = win.addPlot(title="多条折线") # 在图形中绘制3条折线 p2.plot(np.random.normal(size=100), pen=(255,0,0), name="红色线条") p2.plot(np.random.normal(size=110)+5, pen=(0,255,0), name="绿色线条") p2.plot(np.random.normal(size=120)+10, pen=(0,0,255), name="蓝色线条") if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
在图形中绘制点
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 p3 = win.addPlot(title="在图形中绘制点") p3.plot( np.random.normal(size=100), # 随机数组曲线 pen=(200,200,200), # 画笔颜色 symbolBrush=(0,255,0), # 符号画笔颜色 symbolPen='w', # 符号外圈颜色 ) if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
使用图形参数
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 p4 = win.addPlot(title="使用参数来显示网格") x = np.cos(np.linspace(0, 2*np.pi, 1000)) # 生成X轴数据 y = np.sin(np.linspace(0, 4*np.pi, 1000)) # 生成Y轴数据 p4.plot(x, y) # 绘制图形 p4.showGrid(x=True, y=True) # 启用X、Y轴网格 if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
散点图、坐标轴标签和刻度
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 p5 = win.addPlot(title="散点图、坐标轴标签、坐标轴刻度") x = np.random.normal(size=1000) * 1e-5 # 生成X轴数据 y = x*1000 + 0.005 * np.random.normal(size=1000) # 生成Y轴数据 y -= y.min()-1.0 mask = x > 1e-15 x = x[mask] y = y[mask] p5.plot(x, y, pen=None, symbol='t', symbolPen=None, symbolSize=10, symbolBrush=(100, 100, 255, 50)) p5.setLabel('left', "Y Axis", units='A') # 设置横坐标轴标签文本 p5.setLabel('bottom', "Y Axis", units='s') #设置纵坐标轴标签文本 p5.setLogMode(x=True, y=False) # 设置坐标轴刻度模式 if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
实时数据更新绘图
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 p6 = win.addPlot(title="绘图数据更新") curve = p6.plot(pen='y') # 图形使用黄色画笔进行绘制 data = np.random.normal(size=(10,1000)) # 生成随机数据 ptr = 0 # 初始为0 # 定义一个更新函数 def update(): global curve, data, ptr, p6 curve.setData(data[ptr%10]) # 设置图形的数据值 if ptr == 0: p6.enableAutoRange('xy', False) ## 在第一个图形绘制的时候停止自动缩放 ptr += 1 timer = QtCore.QTimer() # 实例化一个计时器 timer.timeout.connect(update) # 计时器信号连接到update()函数 timer.start(200) # 计时器间隔200毫秒 if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
填充图形、禁用坐标轴
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 p7 = win.addPlot(title="填充图形,禁用坐标轴") y = np.sin(np.linspace(0, 10, 1000)) + np.random.normal(size=1000, scale=0.1) # 生成图形数据 p7.plot(y, fillLevel=0, brush=(50,50,200,100) ) p7.showAxis('bottom', False) # 底部坐标轴不显示 if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
区域选择
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 x2 = np.linspace(-100, 100, 1000) data2 = np.sin(x2) / x2 p8 = win.addPlot(title="区域选择") p8.plot(data2, pen=(255,255,255,200)) # 添加一个线区域选择项目,起始区间在400到700 lr = pg.LinearRegionItem([400,700]) p8.addItem(lr) if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
放大区域选择
# coding:utf-8 # 作者:州的先生 # 博客:https://zmister.com from pyqtgraph.Qt import QtGui, QtCore import numpy as np import pyqtgraph as pg # 实例化一个绘图窗口 win = pg.GraphicsWindow() win.resize(1000,600) win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com') # 启用抗锯齿选项 pg.setConfigOptions(antialias=True) # 添加一个图形 x2 = np.linspace(-100, 100, 1000) data2 = np.sin(x2) / x2 p8 = win.addPlot(title="区域选择") p8.plot(data2, pen=(255,255,255,200)) # 添加一个线区域选择项目,起始区间在400到700 lr = pg.LinearRegionItem([400,700]) p8.addItem(lr) p9 = win.addPlot(title="放大区域选择") p9.plot(data2) # 更新绘图 def updatePlot(): p9.setXRange(*lr.getRegion(), padding=0) # 更新区域选择 def updateRegion(): lr.setRegion(p9.getViewBox().viewRange()[0]) lr.sigRegionChanged.connect(updatePlot) p9.sigXRangeChanged.connect(updateRegion) updatePlot() if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QApplication.instance().exec_()
运行上述代码,会得到如下动图所示的图形界面:
全家福
最后,来一个全家福: