Matplotlib: imshow绘图中set_data无效

16

我遇到了一个奇怪的错误,如果没有你的帮助,我无法解决。在matplotlib中使用imshow设置图像后,即使我使用set_data方法更改它,它仍然保持不变。看看这个例子:

import numpy as np
from matplotlib import pyplot as plt


def newevent(event):
    haha[1,1] += 1
    img.set_data(haha)
    print img.get_array()    # the data is change at this point
    plt.draw()

haha = np.zeros((2,2))
img = plt.imshow(haha)
print img.get_array()        # [[0,0],[0,0]]
plt.connect('button_press_event', newevent)
plt.show()
在我绘制图表后,set_data 方法不能改变图表内部任何内容。有人能解释一下为什么吗?
编辑:我只是添加了几行说明我实际想要做的事情。我想在按下鼠标按钮后重新绘制数据。我不想删除整个图形,因为如果只有一件事情改变,那么这样做就很愚蠢。

只需要一个边缘就可以有另一种颜色。 - ahelm
你在哪里调用newevent函数? - Levon
2个回答

25
问题是因为您在第一次调用后没有更新像素缩放比例。 当您实例化imshow时,它会从初始数据设置vminvmax,并且不再进行修改。在您的代码中,它将vminvmax都设置为0,因为您的数据haha=zeros((2,2))在所有地方都是零。 您的新事件应包括使用img.autoscale()进行自动缩放,或通过将img.norm.vmin/vmax设置为您喜欢的值来明确设置新的缩放术语。 设置新的vminvmax的函数是:
img.set_clim(vmin=new_vim, vmax=new_vmax)

3
这能输出你预期的结果吗?
import numpy as np
from matplotlib import pyplot as plt

haha = np.zeros((2,2))
img = plt.imshow(haha)
print img.get_array()        # [[0,0],[0,0]]
haha[1,1] += 1

img.set_data(haha)    
img = plt.imshow(haha)       # <<------- added this line  
print img.get_array()        # [[0,0],[0,1]]
plt.show()

当我将图形显示两次(一次在更改为 haha 之前,一次在最后),它确实发生了变化。

@PateToni 我没有看到你在哪里调用 newevent -- 我的回答没有解决你的问题吗? - Levon
2
它可以解决问题,但会强制生成额外的图形。每次绘制新的imshow时都会消耗越来越多的内存。 - ahelm
@PateToni 我明白你的意思。你在哪个平台上运行这个程序?在 Windows 7 上,使用 v2.7.2 版本时,即使使用你的代码更新,newevent 也从未被调用。 - Levon
我在Linux下运行它。它能正常工作,但是图表没有变化。 - ahelm
@PateToni 我想我无法提供帮助。我也在Linux下运行了它(Kernel 2.6.32 Ubuntu 10.04LTS),使用Python 2.6.5,如果我将任何打印语句放入newevent并运行您的代码,则没有任何一个print显示,这意味着该函数从未被调用。也许还需要更多的代码才能运行? - Levon
谢谢你的帮助。我不知道为什么它在你的机器上无法运行。我有一个更新版本的Python和Ubuntu,但是很奇怪为什么这对你不起作用。我做这个事件已经好几年了,以前从来没有遇到过问题,只是从来没有尝试更新绘制的数据。 - ahelm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接