如何将pyqtgraph IsocurveItem实例与空的绘图轴(而不是ImageItem)对齐?

时间:2018-06-29 20:48:34

标签: python pyqtgraph

问题

IsocurveItem的pyqtgraph文档有助于建议ImageItem可以将此类绘制的轮廓与isocurve.setParentItem(image)实例对齐。但是,如果我不想显示图像数据,如何缩放轮廓输出以使其与给定的X,Y数据轴正确对齐?

示例设置

使用此代码示例进行绘制:

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
import sys

# Setup
app = QtGui.QApplication([])
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')

win = pg.PlotWidget()
layout = pg.GraphicsLayout()
win.setCentralItem(layout)
ax = pg.PlotItem()
layout.addItem(ax)

# Generate data
x = np.linspace(0, 6.28, 30)
y = x[:]
xx, yy = np.meshgrid(x, y)
z = np.sin(xx) + np.cos(yy)

# Add data
ax.setXRange(x.min(), x.max())
ax.setYRange(y.min(), y.max())
c = pg.IsocurveItem(data=z, level=0.5, pen='r')
# c.setParentItem(ax)  # This doesn't work
ax.addItem(c)

# Finish up
win.show()
sys.exit(app.exec_())

哪个输出:

enter image description here

或者,没有setXRange和setYRange部分,它看起来像这样:

enter image description here

我希望将第二个绘图中的图形拉伸以适合第一个绘图的轴。 因此,我想我只需要告诉IsocurveItem如何在给定X,Y,Z数据而不是Z的情况下压缩并对齐自身即可。

P.S。等效的matplotlib等高线调用为contour(x, y, z, levels=[0.5], colors='r')

*必须处理轴顺序/行优先与列主;没什么。

失败的解决方案

不可见缩放的ImageItem

添加一个ImageItem并缩放它,然后在以后使其不可见。通过将其父级设置为IsocurveItem,尝试使ImageItem缩放:

img = pg.ImageItem(z, axisOrder='row-major')
img.scale((x.max() - x.min()) / img.width(), (y.max() - y.min()) / img.height())
ax.addItem(img)
c.setParentItem(img)

ImageItem可以缩放,但是IsocurveItem并不是随身携带的。

1 个答案:

答案 0 :(得分:1)

IsocurveItem通过.scale()继承了.translate()GraphicsObject方法,它是其中的子类。因此,只需在定义c之后将这些行添加到示例中即可:

c.translate(x.min(), y.min())
c.scale((x.max() - x.min()) / np.shape(z)[0], (y.max() - y.min()) / np.shape(z)[1])

为了使测试更加严格,我还更改了x,使其不会从0开始:

x = np.linspace(10, 16.28, 30)

现在输出 enter image description here

在组合中使用ImageItem进行可视化(也可以转换和缩放)可能会更容易一些: enter image description here