【问题标题】:Using matplotlib slider widget to change clim in image使用 matplotlib 滑块小部件更改图像中的 clim
【发布时间】:2011-04-10 12:47:05
【问题描述】:

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

我正在尝试遵循以下示例:http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html。我试图将绘图命令更改为 imshow,并使用滑块值来设置图像的 clim。但是,我从调用 '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()

【问题讨论】:

    标签: python matplotlib widget


    【解决方案1】:

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

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

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

    这是一个工作示例(使用随机数据):

    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()
    

    【讨论】:

    • 如果有人因为 'imshow()' 没有在更新函数中更新而到达这里,并且您使用 numpy 来填充 'imshow',则应该在来自的变量中使用 int()滑块,即 imshow( [int(var_from_slider_a), int(var_from_slider_b)] )
    • 除了@AlejoBernardin 的评论,您可能还需要在im1.set_clim(...)im1.set_data(...) 或类似名称之后致电im1.draw()
    【解决方案2】:

    根据文档,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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多