9个动图带你进入PyQtGraph的强大可视化世界

自作多情 提交于 2020-08-13 07:24:36
PyQtGraph是一个建立在PyQt/PySide之上的Python数据可视化图形界面库,其性能强、速度快,能够胜任大部分交互式的2D、3D图形绘制,可以搞定数据科学领域大量的数据可视化工作。

州的先生之前绘制的A股股票动态K线图,就是使用PyQtGraph绘制的。

A股复苏,入场还是解套?Python秒绘交互式股票K线图

PyQtGraph官方提供了很好的示例来供学习者了解PyQtGraph的功能,下面我们通过9个图形,来一窥PyQtGraph的可视化世界。

基础的数组绘制折线图

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 使用addPlot()方法直接添加一个数组以绘制图形

  14. p1 = win.addPlot(title="基础数组绘图", y=np.random.normal(size=100))


  15. if __name__ == '__main__':

  16. import sys

  17. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  18. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

一个图形中绘制多条折线

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. p2 = win.addPlot(title="多条折线")

  15. # 在图形中绘制3条折线

  16. p2.plot(np.random.normal(size=100), pen=(255,0,0), name="红色线条")

  17. p2.plot(np.random.normal(size=110)+5, pen=(0,255,0), name="绿色线条")

  18. p2.plot(np.random.normal(size=120)+10, pen=(0,0,255), name="蓝色线条")


  19. if __name__ == '__main__':

  20. import sys

  21. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  22. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

在图形中绘制点

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. p3 = win.addPlot(title="在图形中绘制点")

  15. p3.plot(

  16. np.random.normal(size=100), # 随机数组曲线

  17. pen=(200,200,200), # 画笔颜色

  18. symbolBrush=(0,255,0), # 符号画笔颜色

  19. symbolPen='w', # 符号外圈颜色

  20. )


  21. if __name__ == '__main__':

  22. import sys

  23. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  24. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

使用图形参数

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. p4 = win.addPlot(title="使用参数来显示网格")

  15. x = np.cos(np.linspace(0, 2*np.pi, 1000)) # 生成X轴数据

  16. y = np.sin(np.linspace(0, 4*np.pi, 1000)) # 生成Y轴数据

  17. p4.plot(x, y) # 绘制图形

  18. p4.showGrid(x=True, y=True) # 启用X、Y轴网格


  19. if __name__ == '__main__':

  20. import sys

  21. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  22. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

散点图、坐标轴标签和刻度

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. p5 = win.addPlot(title="散点图、坐标轴标签、坐标轴刻度")

  15. x = np.random.normal(size=1000) * 1e-5 # 生成X轴数据

  16. y = x*1000 + 0.005 * np.random.normal(size=1000) # 生成Y轴数据

  17. y -= y.min()-1.0

  18. mask = x > 1e-15

  19. x = x[mask]

  20. y = y[mask]

  21. p5.plot(x, y, pen=None, symbol='t', symbolPen=None, symbolSize=10, symbolBrush=(100, 100, 255, 50))

  22. p5.setLabel('left', "Y Axis", units='A') # 设置横坐标轴标签文本

  23. p5.setLabel('bottom', "Y Axis", units='s') #设置纵坐标轴标签文本

  24. p5.setLogMode(x=True, y=False) # 设置坐标轴刻度模式


  25. if __name__ == '__main__':

  26. import sys

  27. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  28. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

实时数据更新绘图

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. p6 = win.addPlot(title="绘图数据更新")

  15. curve = p6.plot(pen='y') # 图形使用黄色画笔进行绘制

  16. data = np.random.normal(size=(10,1000)) # 生成随机数据

  17. ptr = 0 # 初始为0

  18. # 定义一个更新函数

  19. def update():

  20. global curve, data, ptr, p6

  21. curve.setData(data[ptr%10]) # 设置图形的数据值

  22. if ptr == 0:

  23. p6.enableAutoRange('xy', False) ## 在第一个图形绘制的时候停止自动缩放

  24. ptr += 1


  25. timer = QtCore.QTimer() # 实例化一个计时器

  26. timer.timeout.connect(update) # 计时器信号连接到update()函数

  27. timer.start(200) # 计时器间隔200毫秒


  28. if __name__ == '__main__':

  29. import sys

  30. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  31. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

填充图形、禁用坐标轴

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. p7 = win.addPlot(title="填充图形,禁用坐标轴")

  15. y = np.sin(np.linspace(0, 10, 1000)) + np.random.normal(size=1000, scale=0.1) # 生成图形数据

  16. p7.plot(y,

  17. fillLevel=0,

  18. brush=(50,50,200,100)

  19. )

  20. p7.showAxis('bottom', False) # 底部坐标轴不显示


  21. if __name__ == '__main__':

  22. import sys

  23. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  24. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

区域选择

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. x2 = np.linspace(-100, 100, 1000)

  15. data2 = np.sin(x2) / x2

  16. p8 = win.addPlot(title="区域选择")

  17. p8.plot(data2, pen=(255,255,255,200))

  18. # 添加一个线区域选择项目,起始区间在400到700

  19. lr = pg.LinearRegionItem([400,700])

  20. p8.addItem(lr)


  21. if __name__ == '__main__':

  22. import sys

  23. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  24. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

放大区域选择

    
  
  
  1. # coding:utf-8

  2. # 作者:州的先生

  3. # 博客:https://zmister.com


  4. from pyqtgraph.Qt import QtGui, QtCore

  5. import numpy as np

  6. import pyqtgraph as pg


  7. # 实例化一个绘图窗口

  8. win = pg.GraphicsWindow()

  9. win.resize(1000,600)

  10. win.setWindowTitle('PyQtGraph基础绘图示例 - zmister.com')


  11. # 启用抗锯齿选项

  12. pg.setConfigOptions(antialias=True)


  13. # 添加一个图形

  14. x2 = np.linspace(-100, 100, 1000)

  15. data2 = np.sin(x2) / x2

  16. p8 = win.addPlot(title="区域选择")

  17. p8.plot(data2, pen=(255,255,255,200))

  18. # 添加一个线区域选择项目,起始区间在400到700

  19. lr = pg.LinearRegionItem([400,700])

  20. p8.addItem(lr)


  21. p9 = win.addPlot(title="放大区域选择")

  22. p9.plot(data2)

  23. # 更新绘图

  24. def updatePlot():

  25. p9.setXRange(*lr.getRegion(), padding=0)


  26. # 更新区域选择

  27. def updateRegion():

  28. lr.setRegion(p9.getViewBox().viewRange()[0])

  29. lr.sigRegionChanged.connect(updatePlot)

  30. p9.sigXRangeChanged.connect(updateRegion)

  31. updatePlot()


  32. if __name__ == '__main__':

  33. import sys

  34. if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):

  35. QtGui.QApplication.instance().exec_()

运行上述代码,会得到如下动图所示的图形界面:

全家福

最后,来一个全家福:

本文分享自微信公众号 - 州的先生(zmister2016)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!