在ubuntu18.04的pyqt5gui中嵌入Matplotlib图形不会根据设置透明度进行渲染

2024-09-30 10:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

通过使用Matplotlib提供的“Qt5Agg”后端,我在pyqt5gui中嵌入了一个实时图形。下面是定义GUI和live图工作的代码

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中。我想在图形后面有一个透明的画布,所以我在LiveGraphCanvas类中将alpha透明度设置为0。在Windows 10上,图形根据设置的alpha值正确显示,如下所示:

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

然而,在Ubuntu18.04上,alpha参数不起作用,我的图形后面有一个难看的白色背景:

Graph GUI on Ubuntu 18.04

(请忽略两张截图之间的色差和形状差异,因为两张截图都是用不同的软件拍摄的)

为什么透明度不能正常发挥作用?是因为Ubuntu的内部GUI限制还是Matplotlib没有为这个平台正确设计


Tags: importself图形datatimematplotlibdeffig

热门问题