使用matplotlib滑块小部件更改图像中的爬升

时间:2011-04-10 12:47:06

标签: python matplotlib widget

我几乎没有使用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()

2 个答案:

答案 0 :(得分:9)

大多数情况下,你只是遇到了很多语法问题。

例如,您尝试解压缩一个值(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 :(得分: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()