Skip to main content

PyQtGraph 库提供带有底层(环形)缓冲区的线程安全绘图曲线。

项目描述

https://img.shields.io/pypi/v/dvg-pyqtgraph-threadsafe https://img.shields.io/pypi/pyversions/dvg-pyqtgraph-threadsafe 需求状态 https://img.shields.io/badge/code%20style-black-000000.svg https://img.shields.io/badge/License-MIT-purple.svg

DvG_PyQtGraph_ThreadSafe

PyQtGraph 库提供带有底层(环形)缓冲区的线程安全绘图曲线。

支持 PyQt5、PyQt6、PySide2 和 PySide6。

安装:

pip install dvg-pyqtgraph-threadsafe

演示可以在演示文件夹中找到。

https://raw.githubusercontent.com/Dennis-van-Gils/python-dvg-pyqtgraph-threadsafe/master/demos/demo_pyqtgraph_threadsafe.png

概述

HistoryChartCurveBufferedPlotCurvePlotCurve环绕一个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

类 LegendSelect(曲线:List[Union[pg.PlotDataItem,ThreadSafeCurve]], hide_toggle_button:bool = False,box_bg_color:QtGui.QColor = QtGui.QColor(0, 0, 0),box_width:int = 40,box_height:int = 23,父母=无)

基础:PyQt5.QtCore.QObject

使用复选框创建和管理所有通过曲线的图例以显示或隐藏每条曲线。图例以按钮结束,可一次性显示或隐藏所有曲线。全套 GUI 元素包含在要添加到 GUI 中的PyQt5.QtWidget.QGridLayout类型的属性网格中。

每条曲线的初始可见性、名称和笔将从通过的曲线内的成员中检索,即:

  • 曲线.isVisible()

  • 曲线名称()

  • 曲线.opts [“笔”]

示例网格:

□ Curve 1  [  /  ]
□ Curve 2  [  /  ]
□ Curve 3  [  /  ]
[ Show / Hide all]
参数:
linked_curves(列表[Union[pyqtgraph.PlotDataItem, ThreadSafeCurve]]):

图例控制的pyqtgraph.PlotDataItemThreadSafeCurve列表。

hide_toggle_button (bool,可选):

默认值:假

box_bg_color (QtGui.QColor,可选):

图例框的背景颜色。

默认值:QtGui.QColor(0, 0, 0)

box_width (int,可选):

默认值:40

box_height ( int , 可选):

默认值:23

属性:
chkbs(列表[PyQt5.QtWidgets.QCheckbox]):

用于控制每条曲线的可见性的复选框列表。

画框(列表[PyQt5.QtWidgets.QWidget]):

画框列表,说明每条曲线的笔。

qpbt_toggle ( PyQt5.QtWidgets.QPushButton ):

一次切换显示/隐藏所有曲线的按钮实例。

网格(PyQt5.QtWidgets.QGridLayout):

全套 GUI 元素组合成一个网格以添加到您的 GUI。

变更日志

3.2.2 (2022-09-18)

  • 更新了关于基准的讨论

  • 在基准文件夹中找到的用于自动创建 conda 环境的批处理文件现在使用 conda-forge 通道。

3.2.1 (2022-09-17)

  • 支持 PyQt 和 PySide 的更整洁的机制

  • 添加了基准

  • 改进的演示

3.2.0 (2022-09-13)

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.tar.gz (103.9 kB 查看哈希

已上传 source

内置分布

dvg_pyqtgraph_threadsafe-3.2.2-py3-none-any.whl (15.0 kB 查看哈希

已上传 py3