Встраивание графиков Matplotlib в PyQt5 GUI в Ubuntu 18.04 не выполняется в соответствии с заданной прозрачностью - PullRequest
0 голосов
/ 27 мая 2019

Используя бэкэнд «Qt5Agg», предоставленный Matplotlib, я встраиваю живой граф в мой графический интерфейс PyQt5.Вот код, который определяет GUI и работу живого Графа.

import matplotlib
matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

import random
import collections
import time
from PyQt5 import QtWidgets


class LiveGraphCanvas(FigureCanvas):
    def __init__(self, parent=None, height=5, width=4, dpi=100):
        fig = Figure(figsize=(height, width), dpi=dpi)
        fig.set_tight_layout(True)
        fig.patch.set_alpha(0.0)

        self.axes = fig.add_subplot(111)
        self.axes.set_xlabel("Data Points")
        self.axes.set_ylabel("Trim width (um)")
        self.axes.grid(True)

        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    # Function which will later be defined by the child-class
    def compute_initial_figure(self):
        pass


class LiveGraphWidget(LiveGraphCanvas):
    def __init__(self, max_points, *args, **kwargs):
        LiveGraphCanvas.__init__(self, *args, **kwargs)
        self.data_length = max_points
        self.data_points = collections.deque([0 for i in range(self.data_length)], maxlen=self.data_length)

    def compute_initial_figure(self):
        self.axes.plot([i for i in range(0, self.data_length)], [random.randint(1000, 6000) for i in range(0, self.data_length)], 'r')

    def update_figure(self, data_point):
        start_time = time.time()
        self.data_points.append(data_point)
        self.axes.cla()
        self.axes.plot(self.data_points, 'r')
        self.axes.set_xlabel("Data Points")
        self.axes.set_ylabel("Trim width (um)")
        self.axes.grid(True)
        self.draw()
        print ("Plot Update Time (ms): ", (time.time() - start_time)*1000)

Затем я создаю объект класса LiveGraphWidget и добавляю его в QVBoxLayout в моем основном классе.Мне нужен прозрачный холст за графиком, поэтому я устанавливаю альфа-прозрачность на 0 в классе LiveGraphCanvas.В Windows 10 график отображается правильно в соответствии с установленным альфа-значением, как показано ниже:

Graph GUI on Windows 10, Ignore the dark shade due to recording software

Однако в Ubuntu 18.04 альфа-параметр неработа, и я получаю уродливый белый фон за моим графиком:

Graph GUI on Ubuntu 18.04

(Пожалуйста, игнорируйте разницу цветового оттенка и формы между двумя скриншотами, так как обабыли взяты с другим программным обеспечением)

Что может быть причиной того, что прозрачность не работает должным образом?Это связано с внутренним ограничением графического интерфейса Ubuntu или с тем, что Matplotlib не предназначен для этой платформы?

...