Matplotlib 图不更新数据更改
Posted
技术标签:
【中文标题】Matplotlib 图不更新数据更改【英文标题】:Matplotlib figure not updating on data change 【发布时间】:2015-06-17 00:20:03 【问题描述】:我正在使用matplotlib
实现图像查看器。这个想法是对图像进行的更改(例如过滤器应用程序)将自动更新。
我创建了一个图形来显示初始图像,并添加了一个使用pyQt
的按钮来更新数据。我检查过数据确实发生了变化,但图没有。 然而,如果在我按下过滤器应用按钮后,我使用matplotlib
的标准工具栏移动图像,图像就会被更新。
我认为我在更新图像时做错了,但由于移动它实际上会强制更新,因此它会显示数据更改。不过,我希望当我按下按钮时会发生这种情况。
以下是部分代码。这是初始图形初始化,显示原始图像:
self.observableFig = Figure((4.0, 4.0), dpi=100)
self.canvas = FigureCanvas(self.observableFig)
self.canvas.setParent(self.observableWindow)
self.canvas.setFocusPolicy(Qt.StrongFocus)
self.canvas.setFocus()
self.canvas.mpl_connect('button_press_event', self.on_click)
# Showing initial data on Window
self.observableFig.clear()
self.observableAxes = self.observableFig.add_subplot(1, 1, 1)
min, max = self.min, self.max
self.observableAxes.imshow(
self.data,
vmin=min,
vmax=max,
origin='lower'
)
这是按下更改数据的按钮时的事件:
self.observableAxes.imshow(self.data/2, origin='lower')
# plt.clf()
# plt.draw()
# plt.show()
我尝试过draw()
、show()
,基本上是我在pyplot
上找到的任何关于此的内容。一开始我也尝试过使用plt.ion()
和不使用plt.ion()
,但这并没有什么不同。
提前致谢。
【问题讨论】:
【参考方案1】:没有更新的原因是您尝试使用pyplot
方法来处理不属于 pyplot 状态机的图形。 plt.draw()
不会画这个图,因为plt
不知道这个图的存在。
请改用fig.canvas.draw()
。
无论如何,最好使用fig.canvas.draw()
而不是plt.draw()
,因为很清楚您要绘制哪个图形(前者绘制一个,后者绘制所有图形,但前提是它们被pyplot
跟踪)。
尝试以下方法:
import numpy as np
import matplotlib.pyplot as plt
data = np.random.random((10,10))
# To make a standalone example, I'm skipping initializing the
# `Figure` and `FigureCanvas` and using `plt.figure()` instead...
# `plt.draw()` would work for this figure, but the rest is identical.
fig, ax = plt.subplots()
ax.set(title='Click to update the data')
im = ax.imshow(data)
def update(event):
im.set_data(np.random.random((10,10)))
fig.canvas.draw()
fig.canvas.mpl_connect('button_press_event', update)
plt.show()
【讨论】:
感谢您的回答。我想知道您所说的“后者吸引所有人,但前提是它们被pyplot
跟踪”是什么意思……有没有一种方法可以让pyplot
实际添加要“跟踪”的数字?我想这在想要刷新许多数字时可能很有用
@Fran - “由 pyplot 跟踪”,我基本上是指“使用 plt.figure()
或 plt.subplots()
创建的。听起来您将 matplotlib 嵌入到某种 gui 框架中?如果是这样, 你不希望在这个意义上由 pyplot 跟踪的东西。否则,它们将有自己的 gui 窗口。但是,如果你不编写单独的 gui 应用程序,那么最好创建使用 pyplot 的数字正是您刚才提到的原因。以上是关于Matplotlib 图不更新数据更改的主要内容,如果未能解决你的问题,请参考以下文章
无法使用按钮和自定义数据更新 Tkinter matplotlib 图