想要在pyqt中显示matplotlib的绘图,在绘图时,其实不必使用以下语句:
matplotlib.use("Qt5Agg") # 声明使用QT5
最关键的语句是:
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
FigureCanvasQTAgg是一个渲染器,它的工作就是不停的drawing,从而将物体显示在屏幕上。
在这里可以理解为将matplotlib中的figure对象变为一个Qt widgets.
QGraphicsView、QGraphicsProxyWidget和QGraphicsScene是Qt中用于实现2D图形界面的重要类。
- QGraphicsView是用于显示场景和处理用户交互的窗口部件
- QGraphicsScene是一个图形场景,它可以容纳和管理大量的2D图形项(QGraphicsItem)
- QGraphicsProxyWidget则是将QWidget封装成为一个QGraphicsItem以便添加到QGraphicsScene中
import sys
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsProxyWidget, QPushButton
import numpy
import matplotlib
import matplotlib.pyplot as plt
# 其中构造函数Figure()用来创建一个类似Matlab的figure()或matplotlib.pyplot的figure()
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
# 自定义绘图类
class MyFigure(FigureCanvasQTAgg): # 表示MyFigure 继承 FigureCanvasQTAgg
"""FigureCanvasQTAgg的最终的父类其实是QWidget。"""
def __init__(self, parent=None):
# 创建一个Figure对象
self.fig = Figure(figsize=(10, 6), dpi=72) # 新建一个figure
# 在父类中激活Figure,同时继承父类属性
# 此句必不可少,否则不能显示图形
super(MyFigure,self).__init__(self.fig) # 执行父类的__init__函数,使得我们能够调用父类的init中的属性
self.axes = self.fig.add_subplot(111) # 建立一个子图,如果要建立复合图,可以在这里修改
# plt.clf() # 每次绘图的时候,清除上一次的绘图
# 创造数据
numpy.random.seed(1)
x = numpy.random.uniform(-3, 3, 256)
y = numpy.random.uniform(-3, 3, 256)
# 进行绘图
self.axes.triplot(x, y)
self.axes.set(xlim=(-3, 3), ylim=(-3, 3))
self.fig.canvas.draw()
if __name__ == "__main__":
# 创建了一个QApplication实例
app = QApplication(sys.argv)
# QGraphicsScene是一个图形场景,它可以容纳和管理大量的2D图形项(QGraphicsItem)
# 创建一个QGraphicsScene
scene = QGraphicsScene()
# 创建了一个QGraphicsView实例
# QGraphicsView是用于显示绘图的窗口部件
# 在绘图窗口中显示图形场景
# 把QGraphicsScene添加到QGraphicsView中显示
view = QGraphicsView(scene)
# 实例化自定义的绘图
myfig = MyFigure()
# QGraphicsProxyWidget则是将QWidget封装成为一个QGraphicsItem
# 以便添加到QGraphicsScene中
proxy = QGraphicsProxyWidget()
proxy.setWidget(myfig)
""" 以上代码将myfig封装成为一个QGraphicsItem """
# 将QGraphicsProxyWidget添加到场景中
# 在场景中显示自定义的绘图
scene.addItem(proxy)
view.show()
sys.exit(app.exec_())
以上代码中,首先我们创建了一个QApplication实例和一个QGraphicsScene实例。
然后创建了一个QPushButton实例作为QGraphicsProxyWidget的子控件
接着将自定义的绘图,封装成一个QGraphicsProxyWidget,并将其添加到场景QGraphicsScene中。
最后,我们创建了一个QGraphicsView实例,并将其设置为显示我们绘图的图片。