我几乎没有使用python的经验,但我正在尝试创建一个简单的脚本来加载图像,并使用滑块小部件来调整颜色栏的最小和最大值,并相应地重新绘制图像数据。
我试着遵循这个例子:http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html。我已经尝试将plot命令更改为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()发布于 2011-04-11 00:20:06
大多数情况下,你只是有很多很多的语法问题。
例如,您试图解压一个值(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()发布于 2011-04-11 00:20:17
根据文档,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()。
https://stackoverflow.com/questions/5611805
复制相似问题