如何在 pyqtgraph 远程视图上绘制切片的 numpy 数据数组

Posted

技术标签:

【中文标题】如何在 pyqtgraph 远程视图上绘制切片的 numpy 数据数组【英文标题】:How do I plot a sliced numpy data array on a pyqtgraph remoteview 【发布时间】:2014-06-08 02:01:56 【问题描述】:

我在使用 PyQTGraph 中的 RemoteGraphicsView() 功能时遇到问题。我有一个 numpy ndarray,我希望将其绘制在 RemoteGraphicsView 上(以提高速度,因为它在单独的进程中运行)。我想绘制数据的一部分,但它失败并出现 TypeError

TypeError: must be string or single-segment read-only buffer, not numpy.ndarray

下面是一个代码sn-p,它演示了我在一个更大的程序中遇到的问题。可以看出,数据是一个被切片的 numpy.ndarray。

import pyqtgraph as pg
import numpy as np
import pyqtgraph.widgets.RemoteGraphicsView

app = pg.mkQApp()

datview = pg.widgets.RemoteGraphicsView.RemoteGraphicsView(debug=False)
datview.pg.setConfigOptions(antialias=True) 
allplots = datview.pg.GraphicsLayout()
datview.setCentralItem(allplots)

w1 = allplots.addPlot(row=0,col=0)

layoutWG = pg.LayoutWidget()
layoutWG.addWidget(datview)
layoutWG.show()

data = np.random.randn(10000,100)
curve1 = w1.plot(pen='r')

now = pg.ptime.time()
for n in range(100):
    curve1.setData(data[:,n])
    app.processEvents()

app.exec_()

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

看起来进程间通信系统需要一个连续的数组。这应该有效:

    curve1.setData(np.ascontiguousarray(data[:,n]))

或者,您可以定义数据,使您想要的切片已经是连续的:

data = np.random.randn(100,10000)
...
for n in range(100):
    curve1.setData(data[n])

我还建议进行一些更改以加快速度:

# Prevent lookups to curve1.setData from immediately requesting and returning
# the method proxy every time it is called
curve1._setProxyOptions(deferGetattr=True)

for n in range(100):
    # Use _callSync='off' to prevent the main process waiting for a return 
    # value
    curve1.setData(np.ascontiguousarray(data[:,n]), _callSync='off')

【讨论】:

感谢 cmets。我在我的主编中设置了这两个选项(我按照你的例子比较了本地和远程绘图)。我还发现data[:,n].copy() 也可以。无论如何,我可能会恢复到本地绘图,因为我需要访问其他一些很棒的功能,例如 LinearRegionItem,它也不喜欢在远程绘图上运行

以上是关于如何在 pyqtgraph 远程视图上绘制切片的 numpy 数据数组的主要内容,如果未能解决你的问题,请参考以下文章

pyqtgraph:在 GLSurfacePlotItem 对象上设置 smooth=False 的问题

如何使用 PyQtGraph 绘制图像上两点之间的水平距离

如何在 PyQtGraph 中绘制音频波形

pyqtgraph:如何绘制时间序列(x 轴上的日期和时间)?

如何在pyqtgraph中绘制十字准线并绘制鼠标位置?

如何更改 PyQtGraph ImageView 中的鼠标滚轮行为?