Проблема
Документация pyqtgraph для IsocurveItem помогает предположить, что контуры, нарисованные с помощью этого класса, могут быть выровнены с экземпляром 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_())
Что выводит это:
Или без частей setXRange и setYRange это выглядит так:
Я хочу, чтобы рисунок из второго графика растягивался так, чтобы он соответствовал осям первого.
Итак, я думаю, что мне просто нужно сказать 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
не подходит для поездки.