PyQtGraph 库提供带有底层(环形)缓冲区的线程安全绘图曲线。
项目描述
DvG_PyQtGraph_ThreadSafe
PyQtGraph 库提供带有底层(环形)缓冲区的线程安全绘图曲线。
支持 PyQt5、PyQt6、PySide2 和 PySide6。
安装:
pip install dvg-pyqtgraph-threadsafe
演示可以在演示文件夹中找到。
概述
类HistoryChartCurve、BufferedPlotCurve和PlotCurve环绕一个pyqtgraph.PlotDataItem实例,为方便起见称为曲线。可以从任何线程安全地附加或设置数据。
(x, y) 曲线数据在类内部缓冲,依赖于循环/环形缓冲区或常规数组缓冲区:
- 历史图表曲线
环形缓冲区。绘制的 x 数据将移动,使得右侧始终设置为 0。即,当x表示时间时,数据按时间向后绘制,因此称为历史图表。最新数据位于环形缓冲区的右侧。
- 缓冲绘图曲线
环形缓冲区。数据将按原样绘制。也可以充当李萨如的形象。
- 绘图曲线
常规数组缓冲区。数据将按原样绘制。
用法:
import sys from PyQt5 import QtWidgets import pyqtgraph as pg from dvg_pyqtgraph_threadsafe import HistoryChartCurve class MainWindow(QtWidgets.QWidget): def __init__(self, parent=None, **kwargs): super().__init__(parent, **kwargs) self.gw = pg.GraphicsLayoutWidget() self.plot_1 = self.gw.addPlot() # Create a HistoryChartCurve and have it wrap around a new PlotDataItem # as set by argument `linked_curve`. self.tscurve_1 = HistoryChartCurve( capacity=5, linked_curve=self.plot_1.plot(pen=pg.mkPen('r')), ) grid = QtWidgets.QGridLayout(self) grid.addWidget(self.gw) app = QtWidgets.QApplication(sys.argv) window = MainWindow() # The following line could have been executed from inside of another thread: window.tscurve_1.extendData([1, 2, 3, 4, 5], [10, 20, 30, 20, 10]) # Draw the curve from out of the main thread window.tscurve_1.update() window.show() sys.exit(app.exec_())
基准
如果您打算使用此库在集成 GPU 而不是专用(性能)GPU 上以高帧速率绘制 100.000 个点,您可能会遇到性能问题。即使启用了 OpenGL 硬件加速。
我建议您运行 benchmark 文件夹中的性能基准测试。它可以在您选择的 GPU 上测试不同的 PyQtGraph 版本和 Qt 库。我发现旧的pyqtgraph 0.11库有时会在集成 GPU 上产生比pyqtgraph 0.12更好的性能。查看基准测试结果。
API
类 ThreadSafeCurve(容量:可选 [int],linked_curve:pg.PlotDataItem,shift_right_x_to_zero:bool = False,use_ringbuffer = None)
为线程安全的绘图曲线提供基类,可以从任何线程安全地将 (x, y) 数据附加或设置到该曲线上。它将环绕传递的类型为 pyqtgraph.PlotDataItem的参数linked_curve,并将管理曲线下的 (x, y) 数据缓冲区。
预期的多线程操作:一个或多个线程将新数据推送到ThreadSafeCurve -缓冲区。另一个线程通过调用update()来执行 GUI 刷新,这将根据当前缓冲区内容重绘曲线。
- 参数:
- 容量(int,可选):
当提供整数时,它定义了每个 x 数据和 y 数据缓冲区可以存储的最大操作点数。x 数据缓冲区和 y 数据缓冲区各自是一个环形缓冲区。新读数放置在缓冲区的末尾(右侧),当缓冲区达到其最大容量 (FIFO) 时,推出最旧的读数。使用方法appendData()和extendData()推入新数据。
当提供None时,x-data 和 y-data 缓冲区每个都是未定义长度的常规数组缓冲区。使用方法setData() 设置数据。
- 链接曲线(pyqtgraph.PlotDataItem):
将缓冲数据绘制到的pyqtgraph.PlotDataItem实例。
- shift_right_x_to_zero (bool,可选):
绘图时,是否应移动 x 数据以使右侧始终设置为 0?对历史图表很有用。
默认值:假
- use_ringbuffer ( bool , 已弃用):
自 v3.1.0 起已弃用。为向后兼容而定义。只需提供容量值即可启用环形缓冲区。
- 属性:
- x_axis_divisor (浮动):
绘制绘图曲线时,缓冲区中的 x 数据将除以该因子。例如,用于将 x 轴单位从毫秒转换为秒或分钟。
默认值:1
- y_axis_divisor (浮动):
与x_axis_divisor相同的功能。
默认值:1
方法
- 附加数据(x,y)
将单个 (x, y) 数据点附加到环形缓冲区。
- 扩展数据(x_list,y_list)
使用 (x, y) 数据点列表扩展环形缓冲区。
- 设置数据(x_list,y_list)
设置常规数组缓冲区的 (x, y)-data。
- 更新(创建快照:布尔=真)
通过创建缓冲区当前内容的快照来更新曲线后面的数据,并在屏幕上重新绘制曲线。
您可以通过将参数create_snapshot设置为 False来禁止更新曲线后面的数据 。然后将仅根据旧数据重新绘制曲线。这在绘图暂停时很有用。
- 清除()
清除曲线的内容并重新绘制。
- 姓名()
获取曲线的名称。
isVisible() ->布尔值
setVisible(状态:布尔=真)
- setDownsampling(*args, **kwargs)
所有参数都将传递给基础曲线的方法 pyqtgraph.PlotDataItem.setDownsampling()。
特性
- 大小->元组 [int, int]:
当前包含在曲线的基础 (x, y)- 缓冲区中的元素数。请注意,这不一定是当前绘制曲线的元素数。相反,它反映了它后面的数据缓冲区的当前大小,这些缓冲区将在下一次调用update()时被绘制到屏幕上。
类 HistoryChartCurve(容量:int,linked_curve:pg.PlotDataItem)
基础:ThreadSafeCurve
为 (x, y) 数据提供带有底层环形缓冲区的线程安全曲线。新读数放置在缓冲区的末尾(右侧),当缓冲区达到其最大容量 (FIFO) 时,推出最旧的读数。使用方法appendData()和 extendData()推入新数据。
绘制的 x 数据将移动,使得右侧始终设置为 0。即,当x表示时间时,数据按时间向后绘制,因此称为历史图表。
有关更多详细信息,请参见类ThreadSafeCurve。
类 BufferedPlotCurve(容量:int,linked_curve:pg.PlotDataItem)
基础:ThreadSafeCurve
为 (x, y) 数据提供带有底层环形缓冲区的线程安全曲线。新读数放置在缓冲区的末尾(右侧),当缓冲区达到其最大容量 (FIFO) 时,推出最旧的读数。使用方法appendData()和 extendData()推入新数据。
有关更多详细信息,请参见类ThreadSafeCurve。
类 PlotCurve(容量:int,linked_curve:pg.PlotDataItem)
基础:ThreadSafeCurve
为 (x, y) 数据提供带有底层常规数组缓冲区的线程安全曲线。使用方法setData()设置数据。
有关更多详细信息,请参见类ThreadSafeCurve。
变更日志
3.2.2 (2022-09-18)
更新了关于基准的讨论
在基准文件夹中找到的用于自动创建 conda 环境的批处理文件现在使用 conda-forge 通道。
3.2.1 (2022-09-17)
支持 PyQt 和 PySide 的更整洁的机制
添加了基准
改进的演示
3.2.0 (2022-09-13)
根据 Mathijs van Gorcum ( https://github.com/mvgorcum )的拉取请求的建议,添加了对 PyQt5、PyQt6、PySide2 和 PySide6 的支持。
3.1.0 (2021-05-10)
从 init PlotCurve()中删除了冗余参数容量。它不使用环形缓冲区,因此不需要容量。
3.0.1 (2020-08-07)
Bug修复:
使用typing.TypedDict破坏了 Python 3.6 和 3.7 下的支持。由条件导入typing_extensions 修复。
在不使用 OpenGL 时,当setClipToView(True)和曲线数据超出视图框限制时,曲线绘图被破坏。原因是我对connect的计算不正确。 通过再次注释掉连接来修复。每当遇到 NaN 时,曲线现在将连续显示(线性插值),而不是正确分段。这是可以接受的。
3.0.0 (2020-08-07)
将参数LegendSelect.curves重命名为 LegendSelect.linked_curves
将LegendSelect()类的基础从QWidget更改为QObject
添加类PlotManager()
2.0.1 (2020-08-03)
解决方法:PyQt5 >= 5.12.3会导致PyQtGraph中出现错误,如果曲线包含 NaN(但仅在禁用 OpenGL 的情况下),则不会呈现曲线。曲线现在将正确显示,即,每当遇到 NaN 时,曲线就会分段。启用 OpenGL 后,将根据pyqtgraph.plotCurveItem.paintGL()在间隙处发生线性插值。
2.0.0 (2020-08-02)
方法名称现在符合PyQtGraph命名风格。即 setData()与set_data()等。
PyQtGraph的默认值不再被覆盖。
添加类LegendSelect
1.0.0 (2020-07-30)
PyPI 上的第一个版本
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置分布
dvg_pyqtgraph_threadsafe -3.2.2-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | baa2b48b07f9616b0da1353f3c85b10c69ec784ecba33036296b1f3ef2aa144e |
|
MD5 | 1cd596b8eaf475c3fd53e5c9056752d5 |
|
布莱克2-256 | 486a8ffe19e2759d66e515737039bd346575f103248a3e8a4a3ca339ef7ec68d |