在PyQt中嵌入Matplotlib绘图:面向对象与Pyplot混合使用指南
本文介绍如何在PyQt界面中嵌入Matplotlib绘图。核心在于结合使用面向对象API与Pyplot API,通过FigureCanvasQTAgg将图形控件添加到布局中。文章提供了完整的代码示例,展示如何创建Figure和Axes,绘制图像并添加颜色条,最终实现GUI界面上的动态绘图显示。
PyQt中嵌入Matplotlib绘图的方法
以下内容为个人整理的参考资料,供后续学习查阅。
# 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能够简化代码结构,提升开发效率。
以上内容即为本文的全部要点,希望能为读者的学习提供实际帮助。同时也感谢大家对本平台的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













