Горизонтальный градиент pyqtgraph/PySide6 мерцает при обновлении данных и повторяет градиентPython

Программы на Python
Ответить
Anonymous
 Горизонтальный градиент pyqtgraph/PySide6 мерцает при обновлении данных и повторяет градиент

Сообщение Anonymous »

Я использую PySide6 с pyqtgraph для отображения графика данных, где ось X фиксирована в диапазоне 350–850 (представляет длину волны света), и у меня есть горизонтальный градиент, где цвет соответствует цвету света на этой длине волны.
Горизонтальный градиент отображается нормально, но когда данные обновляются (на самом деле только тогда, когда в данных происходят большие изменения), градиент на мгновение мерцает, и градиент повторяется примерно в 10 раз. ось X). Я приложил несколько изображений, демонстрирующих «сбой».
Изображение
Изображение
Изображение

(Мне пришлось уменьшить размер GIF-изображения, чтобы его можно было загрузить сюда. Извините за качество)
Я добиваюсь градиента, добавляя к графику «кисть» QLinearGradient. Мне также нужно было вертикальное затухание, чтобы оно постепенно переходило в прозрачное по вертикали, чего я добился, просто добавив дубликат графика спереди с вертикальным градиентом. Я просто скопирую код горизонтального градиента, но хотел бы упомянуть на случай, если возникнет вопрос о том, почему дублируется график и откуда происходит вертикальное затухание.

Код: Выделить всё

import pyqtgraph as pg

class SpectrumGraph(pg.PlotWidget):

def init_plot(self):
background_plot_brush = get_plot_color_gradient()
foreground_plot_brush = get_plot_fade()
gradient_pen = get_plot_pen()

# Initial plot is for color gradient in horizontal direction
self.graph_plot = self.plot(
[], [],
fillLevel=0,
pen=gradient_pen,
brush=background_plot_brush,
autoDownsample=True
)

# Duplicate plot is to apply the vertical fade effect
# Gradient can only be applied in a single direction
self.graph_plot2 = self.plot(
[], [],
fillLevel=0,
pen=gradient_pen,
brush=foreground_plot_brush,
autoDownsample=True
)

def update_plot_data(self, wavelengths, values):
if wavelengths is None or values is None or len(wavelengths) != len(values):
return

self.graph_plot.setData(wavelengths, values, autoDownsample=True)
self.graph_plot2.setData(wavelengths, values, autoDownsample=True)

def get_plot_color_gradient(self):
grad = QLinearGradient(0, 0, 1, 0)
for position, color in self.get_wavelength_gradient_stops():
color.setAlpha(150)
grad.setColorAt(position, color)

grad.setCoordinateMode(QGradient.ObjectMode)
return QBrush(grad)

def get_wavelength_gradient_stops(self, start=350, end=850, step=5):
# Step through the wavelength range and assign a color for each step
stops = []
for wl in range(start, end + 1, step):
position = (wl - start) / (end - start)
position = min(max(position, 0.0), 1.0)
color = self.wavelength_to_rgb(wl)
stops.append((position, color))
return stops

def wavelength_to_rgb(self, wavelength):
# Define graph colors
violet = (0.56, 0.0, 1.0)
blue   = (0.0, 0.0, 1.0)
cyan   = (0.0, 1.0, 1.0)
green  = (0.0, 0.8, 0.0)
yellow = (0.95, 0.95, 0.0)
orange = (1.0, 0.5, 0.0)
red    = (1.0, 0.0, 0.0)
black = (0.0, 0.0, 0.0)

# Define the gradient stops as (wavelength, color)
color_stops = [
(350, black),
(400, violet),
(415, violet),
(467, blue),
(492, cyan),
(532, green),
(577, yellow),
(607, orange),
(687, red),
(750, red),
(850, black),
]

# Find the two stops surrounding the current wavelength and interpolate between
num_stops = len(color_stops) - 1
for i in range(num_stops):
stop1, color1 = color_stops[i]
stop2, color2 = color_stops[i + 1]
if stop1 

Подробнее здесь: [url]https://stackoverflow.com/questions/79878914/pyqtgraph-pyside6-horizontal-gradient-flickers-when-data-updates-and-repeats-gra[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»