如何使用 PyQtGraph 获取堆栈图?

Posted

技术标签:

【中文标题】如何使用 PyQtGraph 获取堆栈图?【英文标题】:How to get a stackplot with PyQtGraph? 【发布时间】:2020-07-30 09:25:43 【问题描述】:

Matplotlib 库中的stackplot 函数可以按如下方式使用:

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as npr

x = np.linspace(0,10,50)
y = [npr.rand(50) for i in range(4)]

plt.stackplot(x,y)
plt.show()

我需要为一个项目使用 PyQtGraph 库:

    import pyqtgraph as pg
    from pyqtgraph.Qt import QtGui
    import numpy as np
    import numpy.random as npr

    x = np.linspace(0,10,50)
    y = [npr.rand(50) for i in range(4)]

    win = pg.GraphicsWindow()
    graph = win.addPlot()
    #stackplot function
    QtGui.QApplication.instance().exec_()

如何获得堆栈图?

【问题讨论】:

如果您想获得 X 或 Y 库的解决方案,那么您必须创建 2 个问题:每个库 1 个问题。在这种情况下,我已经删除了与 Vispy 相关的所有内容,您必须将它们放在另一个问题中。 【参考方案1】:

Pyqtgraph 没有内置的堆栈绘图功能,但您可以自己编写,只需在要堆栈的每一行之前总结绘图数据,并使用 PlotCurveItemfillLevelfillBrush 参数.示例:

import pyqtgraph as pg
import numpy as np

data = np.random.normal(size=(7,10), scale=0.1, loc=1)
stacked = np.cumsum(data, axis=0)

plt = pg.plot()
for i,row in enumerate(stacked):
    curve = plt.plot(row, fillLevel=0, fillBrush=(i,10))
    curve.setZValue(10-i)

【讨论】:

我没有在我的问题中提到我想显示实时图。在您回答之前,我创建了一条曲线 y = 0,使用了 fills = [pg.FillBetweenItem(y, curve_1), ..., pg.FillBetweenItem(curve_n_minus_1, curve_n)] 和 graph.addItem(f) 来填充 f。我使用 graph.clear() 更新了图表,在每条曲线上设置数据,重新创建填充变量并在每次迭代时将 f 添加到图表中。您的解决方案与setData 相结合,速度提高了约 8 倍,非常感谢!

以上是关于如何使用 PyQtGraph 获取堆栈图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同图表之间共享 pyqtgraph 图?

如何像使用 Dpi 一样在 pyqtgraph 中保存高质量的图形图像?

如何获取 pg.infiniteLine 已在 pyqtgraph 中移动的事件

如何设置pyqtgraph轴标签偏移量?

如何在 PyQtGraph 的一个图中绘制两个实时数据?

将 pyqtgraph 嵌入到 enaml 中......如何?