Python 使用matplotlib滑块小部件更改图像中的clim

Python 使用matplotlib滑块小部件更改图像中的clim,python,matplotlib,widget,Python,Matplotlib,Widget,我几乎没有使用python的经验,但我正在尝试创建一个简单的脚本,加载一个图像,并使用slider小部件调整颜色条的最小值和最大值,并相应地重新绘制图像数据 我试图遵循以下示例:。我尝试将plot命令更改为imshow,并使用滑块值设置图像的clim。但是,我从调用“im1,=ax.imshow”(在下面代码的第12行)中得到以下错误消息: “AxeImage”对象不可编辑 我不明白这个调用的作用,但显然它不能与imshow()一起使用。如果在该调用中删除逗号,则不会出现错误,但滑块更改时图像不

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

我试图遵循以下示例:。我尝试将plot命令更改为imshow,并使用滑块值设置图像的clim。但是,我从调用“im1,=ax.imshow”(在下面代码的第12行)中得到以下错误消息:

“AxeImage”对象不可编辑

我不明白这个调用的作用,但显然它不能与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()

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

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

另外,我从您的示例中删除了pylab import*中的
。这对于交互使用是很好的,但是请不要将其用于实际代码。这使得您很难判断调用的函数来自何处(尤其是pylab名称空间,其设计非常庞大。它应仅用于交互式或快速一次性脚本)

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


根据文档,
imshow
返回一个“matplotlib.image.AxesImage”对象。当您输入逗号时,Python假定函数的返回类型将是iterable(通常是元组,但不一定是这样),因为Python允许您编写如下代码:

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


我不完全确定Python在未经检查的情况下在
im1
中放入了什么(但从您的问题中我得到的印象是编写
im1,=…
有效,而
im1=…
无效),但我怀疑您出于某种原因未能绘制图像。
update
真的被调用了吗?如果是这样,可以尝试使用
im1.draw()

如果有人因为“imshow()”在更新函数中没有更新而来到这里,并且您使用numpy填充“imshow”,那么您应该在来自滑块的变量中使用int(),例如,imshow([int(var\u from\u Slider\u a)、int(var\u from\u Slider\u b)])
a = my_function() # a = (c, d)
a, b = my_function() # a = c, b = d
a, = my_function() # you should get an error