【matplotlib】Python在PyQt5中使用matplotlib无法重复画图的问题

问题描述

应用情景:有一个绘图区,两个按钮,点击按钮在绘图区显示不同的图像。
遇到问题:点击按钮后并没有进行绘图(初始化可以显示)。

解决办法

图像显示完成之后刷新画布,顺利解决问题。

关键代码

初始化画布

import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

self.fig, self.ax = plt.subplots()
# 或者
# self.fig = plt.figure()
# self.ax = self.fig.add_subplot(111)
# 详见补充内容
self.canvas = FigureCanvas(self.fig)
# 添加到布局中
self.layoutName。addWidget(self.canvas)

显示图像并刷新

self.ax.imshow(img, aspect="auto")
# 画图并刷新
self.canvas.draw()
self.canvas.flush_events()

补充内容

画图方式

在matplotlib中,有两种画图方式:

  • plt.figure(): plt.***系列。通过plt.xxx来画图。这是通过matplotlib提供的一个api,这个plt提供了很多基本的function可以让你很快的画出图来,但是如果你想要更细致的精调,就要使用另外一种方法。第一种方式的代码来看,先生成了一个Figure画布,然后在这个画布上隐式生成一个画图区域进行画图。

  • fig, ax = plt.subplots(): 正统的稍微复杂一点。指定figureaxes,然后对axes单独操作。
    第二种方式同时生成了Figureaxes两个对象,然后用ax对象在其区域内进行绘图。
    如果从面向对象编程(对理解Matplotlib绘图很重要)的角度来看,显然第二种方式更加易于解释,生成的figax分别对画布Figure和绘图区域Axes进行控制,第一种方式反而显得不是很直观,如果涉及到子图零部件的设置,用第一种绘图方式会很难受。
    在实际绘图时,也更推荐使用第二种方式。

名词解释

名词解释

  • Figure fig = plt.figure(): 可以解释为画布。
    画图的第一件事,就是创建一个画布figure,然后在这个画布上加各种元素。
  • Axes ax = fig.add_subplot(1,1,1): 不想定义,没法定义,就叫他axes!
    首先,这个不是你画图的xy坐标抽!
    可以把axes理解为你要放到画布上的各个物体。比如你要画一个太阳,一个房子,一个车在画布上,那么太阳是一个axes,房子是一个axes,etc。
    如果你的figure只有一张图,那么你只有一个axes。如果你的figure有subplot,那么每一个subplot就是一个axes
    axes是matlibplot的宇宙中心!axes下可以修改编辑的变量非常多,基本上能包含你的所有需求。
  • Axis ax.xaxis/ax.yaxis: 对,这才是你的xy坐标轴。
    每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。

部位名称

部位名称

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个任务需要使用Pythonmatplotlibpyqt5库。下面是一个基本的示例代码,可以根据给定的坐标绘制一个简单的图形。 ``` import matplotlib.pyplot as plt from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import Qt class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('My Window') self.setGeometry(100, 100, 800, 600) # 创建一个matplotlib的Figure对象 self.fig = plt.figure(figsize=(6, 6), dpi=100) # 在Figure对象添加一个Axes对象 self.ax = self.fig.add_subplot(111) # 绘制图形 x = [1, 2, 3, 4, 5] y = [3, 5, 2, 7, 4] self.ax.plot(x, y) # 将Figure对象显示在窗口 self.canvas = FigureCanvas(self.fig) self.setCentralWidget(self.canvas) self.show() if __name__ == '__main__': app = QApplication([]) window = MyWindow() app.exec_() ``` 在这个代码,我们创建了一个继承自QMainWindow的窗口类MyWindow。在MyWindow的构造函数,我们首先设置了窗口的标题和大小。然后,我们创建了一个matplotlib的Figure对象,并在其添加了一个Axes对象。我们使用plot函数绘制了一个简单的图形,并将Figure对象显示在窗口。最后,我们启动了应用程序的事件循环。 需要注意的是,我们必须使用Qt的FigureCanvas类将matplotlib的Figure对象嵌入到PyQt5的窗口。此外,我们需要确保我们在主线程运行应用程序的事件循环,否则可能会出现一些奇怪的问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值