将matplotlib绘图嵌入pyqt

我的终极整理,供参考

# coding:utf-8
import matplotlib
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import QDialog, QPushButton, QVBoxLayout
import matplotlib.pyplot as plt
import numpy as np
import sys
"""学好pyplot API和面向对象 API搞定matplotlib绘图显示在GUI界面上"""

class Main_window(QDialog):
    def __init__(self):
        super().__init__()
        # 三步走,定Figure,定Axes,定FigureCanvas
        # 1 直接一段代码搞定figure和axes
        self.figure, (self.ax1, self.ax2) = plt.subplots(figsize=(13, 3), ncols=2)

        # 2 先创建figure再创建axes
        # 2.1 用plt.figure()  /  Figure() 创建figure, 推荐前者
        self.figure = plt.figure(figsize=(5,3), facecolor='#FFD7C4')
        # self.figure = Figure(figsize=(5,3), facecolor='#FFD7C4')
        # 2.2 用plt.subplots()  /  plt.add_subplot() 创建axes, 推荐前者
        (self.ax1, self.ax2) = self.figure.subplots(1, 2)
        # ax1 = self.figure.add_subplot(121)
        # ax2 = self.figure.add_subplot(122)

        # 3 绑定figure到canvas上
        self.canvas = FigureCanvas(self.figure)

        self.button_draw = QPushButton("绘图")
        self.button_draw.clicked.connect(self.Draw)

        # 设置布局
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        layout.addWidget(self.button_draw)
        self.setLayout(layout)

    def Draw(self):
        AgeList = ['10', '21', '12', '14', '25']
        NameList = ['Tom', 'Jon', 'Alice', 'Mike', 'Mary']
        # 将AgeList中的数据转化为int类型
        AgeList = list(map(int, AgeList))

        # 将x,y转化为numpy数据类型,对于matplotlib很重要
        self.x = np.arange(len(NameList)) + 1
        self.y = np.array(AgeList)

        # tick_label后边跟x轴上的值,(可选选项:color后面跟柱型的颜色,width后边跟柱体的宽度)
        self.ax1.bar(range(len(NameList)), AgeList, tick_label=NameList, color='green', width=0.5)
        for a, b in zip(self.x, self.y):
            self.ax1.text(a-1, b, '%d' % b, ha='center', va='bottom')
        plt.title("Demo")

        pos = self.ax2.imshow(np.random.random((100, 100)), cmap=plt.cm.BuPu_r)
        self.figure.colorbar(pos, ax=self.ax2)      # 终于可以用colorbar了

        self.canvas.draw()


# 运行程序
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main_window = Main_window()
    main_window.show()
    app.exec()

总结就是,想要在特定的位置放matplotlib绘图还是要用面向对象的API,但混合使用pyplot的API可以使代码更简单。

<think>好的,用户想了解如何将Matplotlib集成到PyQt5应用程序中。我需要根据提供的引用和系统指令来生成一个详细的步骤教程。首先,我得回忆一下PyQt5和Matplotlib结合的基本方法。 根据引用内容,用户已经有一些示例,比如在PyQt5中嵌入Matplotlib图表,使用FigureCanvasQTAgg来创建画布。可能需要先导入必要的模块,比如FigureCanvas和NavigationToolbar。然后创建一个主窗口类,继承自QWidget或QMainWindow。 接下来,步骤应该是这样的:安装必要的库,比如PyQt5和matplotlib。然后创建主窗口,初始化画布和工具栏。可能需要使用subplots()函数来创建图形和坐标轴,如引用3提到的。然后添加一些示例数据,比如正弦曲线,并绘制到画布上。最后设置布局,把画布和工具栏添加到窗口中,并运行应用程序。 需要注意的地方是,必须确保FigureCanvasQTAgg正确嵌入到Qt的布局中,否则可能显示不出来。另外,工具栏的添加也很重要,方便用户交互。需要检查代码中的语法是否正确,比如导入语句是否正确,类的方法是否对齐。 可能还需要考虑事件循环的问题,确保使用Qt的exec_()方法来启动应用。另外,示例代码中的绘图部分应该简洁明了,比如使用numpy生成数据,然后plot到axes上,最后调用canvas.draw()来更新画面。 用户可能会遇到的问题包括库的版本兼容性,比如matplotlibPyQt5的版本是否匹配。或者布局管理不正确导致组件重叠或无法显示。在回答中可以提醒用户注意这些点,或者提供调试建议。 最后,按照系统指令,生成相关问题,比如如何动态更新图表,如何处理交互事件,或者如何优化性能。这些问题应该与主教程内容相关,帮助用户进一步学习。</think>以下是将Matplotlib嵌入PyQt5应用程序的详细实现步骤: ### 一、环境准备 1. 安装所需库: ```bash pip install pyqt5 matplotlib ``` 2. 导入关键模块: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar import matplotlib.pyplot as plt import numpy as np ``` ### 二、界面构建 ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建绘图容器 self.figure, self.axes = plt.subplots() # 返回Figure和Axes对象[^3] self.canvas = FigureCanvas(self.figure) self.toolbar = NavigationToolbar(self.canvas, self) # 设置布局 layout = QVBoxLayout() layout.addWidget(self.toolbar) layout.addWidget(self.canvas) # 创建中央控件 container = QWidget() container.setLayout(layout) self.setCentralWidget(container) # 绘制示例图形 self.plot_data() ``` ### 三、数据可视化 ```python def plot_data(self): x = np.linspace(0, 4*np.pi, 200) y = np.sin(x) self.axes.clear() self.axes.plot(x, y, 'r-', label='正弦曲线') self.axes.set_title("嵌入Matplotlib示例") self.axes.legend() self.canvas.draw() # 重要:更新画布显示 ``` ### 四、启动应用 ```python if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.resize(800, 600) window.show() app.exec_() ``` 关键特性说明: 1. `FigureCanvasQTAgg` 作为Qt与Matplotlib的桥梁组件[^2] 2. `NavigationToolbar2QT` 提供缩放/平移等交互功能[^1] 3. `subplots()` 方法创建图形和坐标系对象 4. 通过`canvas.draw()`实现动态更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值