Я использую 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]
Я использую PySide6 с pyqtgraph для отображения графика данных, где ось X фиксирована в диапазоне 350–850 (представляет длину волны света), и у меня есть горизонтальный градиент, где цвет соответствует цвету света на этой длине волны. Горизонтальный градиент отображается нормально, но когда данные обновляются (на самом деле только тогда, когда в данных происходят большие изменения), градиент на мгновение мерцает, и градиент повторяется примерно в 10 раз. ось X). Я приложил несколько изображений, демонстрирующих «сбой». [img]https://i.sstatic.net/IlbaLSWk.png[/img] [img]https://i.sstatic.net/eAyG0J9v.png[/img] [img]https://i.sstatic.net/JpZHNwz2.gif[/img]
(Мне пришлось уменьшить размер GIF-изображения, чтобы его можно было загрузить сюда. Извините за качество) Я добиваюсь градиента, добавляя к графику «кисть» QLinearGradient. Мне также нужно было вертикальное затухание, чтобы оно постепенно переходило в прозрачное по вертикали, чего я добился, просто добавив дубликат графика спереди с вертикальным градиентом. Я просто скопирую код горизонтального градиента, но хотел бы упомянуть на случай, если возникнет вопрос о том, почему дублируется график и откуда происходит вертикальное затухание. [code]import pyqtgraph as pg
# 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
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)
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
# 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