pyqtgraph — использовать произвольные значения для оси с ImageItem

У меня такое чувство, что я упускаю здесь что-то очевидное, но я не нашел ничего полезного в Интернете.

У меня есть приложение, которое отображает сигнал с помощью pyqtgraph. Сигнал содержит 1000 выборок, представляющих значения в диапазоне 0–0,5. Построить его с правильными значениями по оси X просто — я просто создаю linspace с правильным диапазоном и количеством элементов и использую его как x в plot.

Но как сделать то же самое для ImageItem внутри PlotWidget? Он использует количество элементов в качестве оси X, и я не смог понять, как указать ему использовать правильные значения.

Взгляните на скриншот — мне нужно использовать те же значения оси X для изображений, что и для графиков ниже. скриншот приложения

Для соответствующих фрагментов кода:
Сначала я создаю X-значения:

self.xval_h = numpy.linspace(0, 0.5, len(self.spectrum_h[-1]))
self.xval_v = numpy.linspace(0, 0.5, len(self.spectrum_v[-1]))

И для обновления сюжетов и изображений:

def update_spectrum(self):
    self.HSpectrum.plot(self.xval_h, self.spectrum_h[-1], clear=True)
    self.VSpectrum.plot(self.xval_v, self.spectrum_v[-1], clear=True)

def update_trace(self):
    self.image_h.setImage(numpy.array(self.spectrum_h).T)
    self.image_v.setImage(numpy.array(self.spectrum_v).T)

Итак, вопрос сводится к тому, как мне использовать мои xval с ImageItem (или PlotWidget, содержащим ImageItem)?

Большое спасибо за помощь!


person daneos    schedule 27.08.2020    source источник
comment
Возможно, этот ответ (stackoverflow.com/a/41963986/11827059) поможет вам.   -  person ENIAC    schedule 27.08.2020
comment
Я нашел и попробовал это. В принципе работает, но генерирует тики именно так, как я их указываю. Таким образом, для полного диапазона я получаю галочку для каждого значения, если я уменьшаю количество тиков, то применяются одни и те же тики независимо от уровня масштабирования. Это означает, что мне нужно будет вручную настроить плотность деления на уровень масштабирования. То, что я ищу, - это хороший способ сопоставить диапазон 0-1000 с диапазоном 0-0,5 с поведением тика по умолчанию.   -  person daneos    schedule 27.08.2020


Ответы (1)


Вы можете определить координаты вашего изображения с помощью setRect и передачи QRectF(x,y,width,height) (x,y для верхнего левого угла или нижнего левого угла, если pg.setConfigOptions(imageAxisOrder=row-major) включен) :

image_width = abs(self.xval_h[0]-self.xval_h[0])
image_height = abs(self.xval_h[0]-self.xval_h[0])  # if x and y-scales are the same
pixel_size = image_width/(self.xval_h.size-1)
self.image_h.setRect(QRectF(self.xval_h[0]-pixel_size/2, self.xval_h[0]-pixel_size/2, image_width, image_height))
person yuzak    schedule 27.10.2020