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 图不更新数据更改的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 条形图不接受数组作为高度参数

无法使用按钮和自定义数据更新 Tkinter matplotlib 图

对于实时数据,Tkinter matplotlib 画布更新太慢

更新 matplotlib 中的行

matplotlib 显示最后n条数据(可用于实时更新)

输入用户数据时如何更新 Matplotlib 中的绘图(通过 PyQt5 按钮)