首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用matplotlib滑块小部件更改图像中的clim

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

Stack Overflow用户
提问于 2011-04-10 20:47:06
回答 2查看 9.8K关注 0票数 7

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

我试着遵循这个例子:http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html。我已经尝试将plot命令更改为imshow,并使用滑块值来设置图像的剪辑。然而,我从调用'im1,=ax.imshow‘(在下面代码的第12行)得到以下错误消息:

“AxesImage”对象不可迭代

我不明白这个调用是做什么的,但显然它不能和imshow()一起使用。如果我删除该调用中的逗号,我不会得到任何错误,但当滑块发生变化时,图像不会更新。有没有人有替代的解决方案,或者解释为什么这个方法不起作用?任何帮助都将不胜感激,谢谢。

我的代码如下:

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-11 00:20:06

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

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

另外,我从您的示例中删除了from pylab import *。这对于交互式使用是很好的,但是请,请,请不要将其用于实际代码。这使得很难辨别您调用的函数来自何处(特别是pylab名称空间在设计上是巨大的。它只能用于交互式使用或快速的一次性脚本。)

下面是一个有效的例子(使用随机数据):

代码语言:javascript
复制
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()
票数 10
EN

Stack Overflow用户

发布于 2011-04-11 00:20:17

根据文档,imshow返回一个`matplotlib.image.AxesImage‘对象。当您放入逗号时,Python假定函数的返回类型将是可迭代的类型(当您要使用此结构时,通常是一个元组,但不是必须的),因为Python允许您编写如下代码:

代码语言:javascript
复制
a = my_function() # a = (c, d)
a, b = my_function() # a = c, b = d

代码语言:javascript
复制
a, = my_function() # you should get an error

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5611805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档