2011-04-10 70 views
6

我几乎没有python的经验,但我试图创建一个简单的脚本加载图像并使用滑块小部件来调整最小和最大的颜色条,并重绘相应的图像数据。使用matplotlib滑块小部件来改变图像上升

我正在尝试关注此示例:http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html。我试图改变阴谋命令imshow,并使用滑块值设置我的形象攀登。不过,我得到以下错误消息,从呼叫“IM1,= ax.imshow”(第12行下面的代码):

“AxesImage”对象不是可迭代

我不明白是什么这个调用的确如此,但显然它不能与imshow()一起使用。如果我在该调用中删除了逗号,则不会出现错误,但当滑块发生更改时,图像不会更新。有没有人有另一种解决方案,或解释为什么这不起作用?任何帮助将不胜感激,谢谢。

我的代码如下:

from pylab import * 
from matplotlib.widgets import Slider, Button, RadioButtons 
import matplotlib.pyplot as plt 
import numpy as np 

close('all') 

ax = subplot(111) 
subplots_adjust(left=0.25, bottom=0.25) 
min0 = 0 
max0 = 25000 

im=np.loadtxt('im.txt') 
im1,=ax.imshow(im) 
colorbar() 

axcolor = 'lightgoldenrodyellow' 
axmin = axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) 
axmax = axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) 

smin = Slider(axmin, 'Min', 0, 30000, valinit=min0) 
smax = Slider(axmax, 'Max', 0, 30000, valinit=max0) 

def update(val): 
    im1.set_clim=(smin.val,smax.val) 
    draw() 
smin.on_changed(update) 
smax.on_changed(update) 

show() 

回答

7

大多数情况下,你只是有很多很多的语法问题。

例如,您试图解压缩单个值(im1,=ax.imshow(im)),给出您在问题中提到的TypeError(因为它应该)。当您打算将它调用时,您还可以将函数设置为一个值:(im1.set_clim=(smin.val,smax.val))。

另外,我从您的示例中删除了from pylab import *。这对于交互式使用来说很好,但请请,请不要将它用于实际代码。这使得很难判断你所调用的函数来自哪里(并且pylab命名空间,特别是巨大的设计。它应该只有被用于交互式使用或快速一次性脚本。 )

这里的一个工作实施例(使用随机数据):

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.widgets import Slider, Button, RadioButtons 

fig = plt.figure() 
ax = fig.add_subplot(111) 
fig.subplots_adjust(left=0.25, bottom=0.25) 
min0 = 0 
max0 = 25000 

im = max0 * np.random.random((10,10)) 
im1 = ax.imshow(im) 
fig.colorbar(im1) 

axcolor = 'lightgoldenrodyellow' 
axmin = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) 
axmax = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) 

smin = Slider(axmin, 'Min', 0, 30000, valinit=min0) 
smax = Slider(axmax, 'Max', 0, 30000, valinit=max0) 

def update(val): 
    im1.set_clim([smin.val,smax.val]) 
    fig.canvas.draw() 
smin.on_changed(update) 
smax.on_changed(update) 

plt.show() 
1

根据文档,imshow返回一个`matplotlib.image.AxesImage”对象。当你输入逗号时,Python假定函数的返回类型是可迭代的(通常是一个元组,当你使用这种构造时,但不一定),因为Python可以让你编写如下代码:

a = my_function() # a = (c, d) 
a, b = my_function() # a = c, b = d 

a, = my_function() # you should get an error 

我不完全知道什么的Python在im1是放而不检查(但是从你的问题,我得到的印象是写im1,=...作品而im1=...没有),但我怀疑你出于某种原因未能绘制图像。 update实际上被称为?如果是,则可以尝试im1.draw()