Как выровнять экземпляр Pyqtgraph IsocurveItem по пустым осям графика (а не ImageItem)? - PullRequest
0 голосов
/ 29 июня 2018

Проблема

Документация 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_())

Что выводит это:

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 голосов
/ 30 июня 2018

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

...