通过使用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值正确显示,如下所示:
然而,在Ubuntu18.04上,alpha参数不起作用,我的图形后面有一个难看的白色背景:
(请忽略两张截图之间的色差和形状差异,因为两张截图都是用不同的软件拍摄的)
为什么透明度不能正常发挥作用?是因为Ubuntu的内部GUI限制还是Matplotlib没有为这个平台正确设计
目前没有回答
相关问题 更多 >
编程相关推荐