pyqtgraph官网

PyQtGraph被大量应用于Qt GUI平台(通过PyQt或PySide),因为它的高性能图形和numpy可用于大量数据处理。 特别注意的是,pyqtgraph使用了Qt的GraphicsView框架,它本身是一个功能强大的图形系统; 我们将最优化和简化的语句应用到这个框架中,以最小的工作量实现数据可视化。

pyqtgraph的核心特征是:
基本的2D交互视图中框绘制
线和散点图
数据可平移/缩放鼠标
实时数据的显示和交互的快速绘制
图像显示与互动的查找表和电平控制
显示所有数据类型(int或float;任何比特深度;RGB,RGBA,或亮度)
切片的多维图像任意角度的函数
快速更新的视频显示和实时交互
三维图形系统(需要Python OpenGL绑定)
体积数据的渲染
三维表面和散点图
网格的等值面生成渲染
交互式视口旋转/缩放鼠标
更容易编程的基本的3D场景图
数据选择/标记和感兴趣的控制区
交互标记垂直/水平的地块的位置和区域
从图像中选择任意区域的部件和自动切片数据匹配
二维图形:

在pyqtgraph中,大多数2D可视化遵循以下鼠标交互:

左键:与场景中的项目交互(选择/移动对象等)。 如果鼠标光标下没有可移动的物体,那么用左边的按钮拖动就会平移场景。
右键拖动:缩放场景。 水平拖动左/右缩放; 向上/向下拖动垂直缩放(尽管某些场景将其x / y缩放比例锁定在一起)。 如果在场景中有x / y轴可以闪动,那么右键拖动轴会影响该轴。
右键单击:在大多数情况下单击右键将根据鼠标光标下的对象显示具有各种选项的上下文菜单。
中间按钮(或滚轮)拖动:按下滚轮拖动鼠标将始终平移场景(在场景中其他对象阻止左侧平移的情况下,此功能非常有用)。
轮旋转:放大和缩小场景。
上下文菜单:

右键单击大多数场景将显示一个上下文菜单,其中包含用于更改场景行为的各种选项。 这个菜单中的一些选项是:

数据范围变化时启用/禁用自动缩放
将多个视图的轴链接在一起
启用禁用每个轴的鼠标交互
显式设置可见范围值
三维图形:

3D可视化使用以下鼠标交互:

左键拖动:围绕中心点旋转场景
中间按钮拖动:通过移动x-y平面内的中央“查看”点来平移场景
中间按钮拖动+ CTRL:通过沿z轴移动中央“查看”点来平移场景
滚轮旋转:放大/缩小
车轮+ CTRL:改变视场角
键盘控制:

箭头键围绕中心点旋转,就像拖动鼠标左键一样

安装pyqtgraph
$ pip install pyqtgraph

安装openGL
$ pip install pyOpenGL -i https://pypi.douban.com/simple

示例代码

"""
This example demonstrates many of the 2D plotting capabilities
in pyqtgraph. All of the plots may be panned/scaled by dragging with 
the left/right mouse buttons. Right click on any plot to show a context menu.
"""

import numpy as np

import pyqtgraph as pg
from pyqtgraph.Qt import QtCore

app = pg.mkQApp("Plotting Example")
#mw = QtWidgets.QMainWindow()
#mw.resize(800,800)

win = pg.GraphicsLayoutWidget(show=True, title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')

# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)

p1 = win.addPlot(title="Basic array plotting", y=np.random.normal(size=100))

p2 = win.addPlot(title="Multiple curves")
p2.plot(np.random.normal(size=100), pen=(255,0,0), name="Red curve")
p2.plot(np.random.normal(size=110)+5, pen=(0,255,0), name="Green curve")
p2.plot(np.random.normal(size=120)+10, pen=(0,0,255), name="Blue curve")

p3 = win.addPlot(title="Drawing with points")
p3.plot(np.random.normal(size=100), pen=(200,200,200), symbolBrush=(255,0,0), symbolPen='w')


win.nextRow()

p4 = win.addPlot(title="Parametric, grid enabled")
x = np.cos(np.linspace(0, 2*np.pi, 1000))
y = np.sin(np.linspace(0, 4*np.pi, 1000))
p4.plot(x, y)
p4.showGrid(x=True, y=True)

p5 = win.addPlot(title="Scatter plot, axis labels, log scale")
x = np.random.normal(size=1000) * 1e-5
y = x*1000 + 0.005 * np.random.normal(size=1000)
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)

p6 = win.addPlot(title="Updating plot")
curve = p6.plot(pen='y')
data = np.random.normal(size=(10,1000))
ptr = 0
def update():
    global curve, data, ptr, p6
    curve.setData(data[ptr%10])
    if ptr == 0:
        p6.enableAutoRange('xy', False)  ## stop auto-scaling after the first data set is plotted
    ptr += 1
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)


win.nextRow()

p7 = win.addPlot(title="Filled plot, axis disabled")
y = np.sin(np.linspace(0, 10, 1000)) + np.random.normal(size=1000, scale=0.1)
p7.plot(y, fillLevel=-0.3, brush=(50,50,200,100))
p7.showAxis('bottom', False)


x2 = np.linspace(-100, 100, 1000)
data2 = np.sin(x2) / x2
p8 = win.addPlot(title="Region Selection")
p8.plot(data2, pen=(255,255,255,200))
lr = pg.LinearRegionItem([400,700])
lr.setZValue(-10)
p8.addItem(lr)

p9 = win.addPlot(title="Zoom on selected region")
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__':
    pg.exec()

运行效果
在这里插入图片描述

PyQtGraph示例模块:
python -m pyqtgraph.examples
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐