PyQt,PySide2中嵌入Matplotlib图像

方式1

使用Qt Designer新建一个Main Window,在此之上创建一个Vertical Layout。
在这里插入图片描述

import sys
import numpy as np

from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication

import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号


class FigureCanvasDemo1(FigureCanvas):
    def __init__(self):
        fig = Figure()
        FigureCanvas.__init__(self, fig)
        self.axes = fig.add_subplot()

        # 开始作图
        x = np.linspace(0, 10, 100)
        y = 2 * np.sin(2 * x)
        self.axes.plot(x, y)
        self.axes.set_title('样例-sin图像')

        self.axes.grid()
        self.draw()


class MainWindow():
    def __init__(self):
        super().__init__()
        loader = QUiLoader()
        # 加载之前新建的ui文件
        self.ui = loader.load("./ui/PicDemo1.ui")

        self.plot = FigureCanvasDemo1()
        layout = self.ui.verticalLayout
        layout.addWidget(self.plot)
        self.ui.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainwindow = MainWindow()
    mainwindow.ui.show()
    sys.exit(app.exec_())

显示效果

在这里插入图片描述

方式2

使用Qt Designer新建一个Main Window,在此之上创建一个Graphics View。
在这里插入图片描述

import sys
import numpy as np

from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication, QGraphicsScene

import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号


class FigureCanvasDemo2(FigureCanvas):
    def __init__(self, parent=None, width=10, height=5):
        # 创建一个Figure 如果不加figsize 显示图像过大 需要缩小
        fig = plt.Figure(figsize=(width, height), tight_layout=True)  # tight_layout: 用于去除画图时两边的空白

        FigureCanvas.__init__(self, fig)  # 初始化父类
        self.setParent(parent)
        self.axes = fig.add_subplot(111)  # 添加子图
        self.axes.spines['top'].set_visible(False)  # 去掉绘图时上面的横线
        self.axes.spines['right'].set_visible(False)  # 去掉绘图时右面的横线


class MainWindow():
    def __init__(self):
        super().__init__()
        loader = QUiLoader()
        # 加载之前新建的ui文件
        self.ui = loader.load("./ui/PicDemo2.ui")

        # 缩小图像尺寸
        self.visual_data = FigureCanvasDemo2(width=self.ui.graphicsView.width() / 101,
                                            height=self.ui.graphicsView.height() / 101)
        x = np.linspace(0, 10, 100)
        y = 2 * np.sin(2 * x)
        self.visual_data.axes.plot(x, y)
        self.visual_data.axes.grid()

        # 加载的图形(FigureCanvas)不能直接放到graphicview控件中,必须先放到graphicScene,然后再把graphicscene放到graphicview中
        self.graphicsScene = QGraphicsScene()  # 创建一个QGraphicsScene
        # 把图形放到QGraphicsScene中,注意:图形是作为一个QWidget放到放到QGraphicsScene中的
        self.graphicsScene.addWidget(self.visual_data)
        # 把QGraphicsScene放入QGraphicsView中
        # self.ui 后跟的是对象的名字 这里QGraphicsView对象的名字是graphicsView
        self.ui.graphicsView.setScene(self.graphicsScene)
        self.ui.graphicsView.show()  # 调用show方法呈现图形

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainwindow = MainWindow()
    mainwindow.ui.show()
    sys.exit(app.exec_())

显示效果

在这里插入图片描述

方式3

ui文件同方式2,还是GraphicsView

import sys
import numpy as np

from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication, QGraphicsScene

import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号


class FigureCanvasDemo3(FigureCanvas):
    def __init__(self, parent=None, width=10, height=5):
        fig = Figure(figsize=(width, height), tight_layout=True)
        FigureCanvas.__init__(self, fig)
        self.axes = fig.add_subplot()

        # 开始作图
        x = np.linspace(0, 10, 100)
        y = 2 * np.sin(2 * x)
        self.axes.plot(x, y)
        self.axes.set_title('样例-sin图像')

        self.axes.grid()
        self.draw()


class MainWindow():
    def __init__(self):
        super().__init__()
        loader = QUiLoader()
        # 加载之前新建的ui文件
        self.ui = loader.load("./ui/PicDemo2.ui")

        self.plot = FigureCanvasDemo3(
            width=self.ui.graphicsView.width() / 101,
            height=self.ui.graphicsView.height() / 101
        )
        self.graphicsScene = QGraphicsScene()  # 创建一个QGraphicsScene
        self.graphicsScene.addWidget(self.plot)
        self.ui.graphicsView.setScene(self.graphicsScene)
        self.ui.graphicsView.show()  # 调用show方法呈现图形


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainwindow = MainWindow()
    mainwindow.ui.show()
    sys.exit(app.exec_())

显示效果

在这里插入图片描述
如果文章对你有用的话,希望给我点个关注点个赞,谢谢。^_^

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值