问题描述
应用情景:有一个绘图区,两个按钮,点击按钮在绘图区显示不同的图像。
遇到问题:点击按钮后并没有进行绘图(初始化可以显示)。
解决办法
图像显示完成之后刷新画布,顺利解决问题。
关键代码
初始化画布
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()
: 正统的稍微复杂一点。指定figure
和axes
,然后对axes单独操作。
第二种方式同时生成了Figure
和axes
两个对象,然后用ax
对象在其区域内进行绘图。
如果从面向对象编程(对理解Matplotlib绘图很重要)的角度来看,显然第二种方式更加易于解释,生成的fig
和ax
分别对画布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图像上的表现。