2011-04-10 61 views
6

我幾乎沒有python的經驗,但我試圖創建一個簡單的腳本加載圖像並使用滑塊小部件來調整最小和最大的顏色條,並重繪相應的圖像數據。使用matplotlib滑塊小部件來改變圖像上升

我正在嘗試關注此示例:http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html。我試圖改變陰謀命令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() 

回答

7

大多數情況下,你只是有很多很多的語法問題。

例如,您試圖解壓縮單個值(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

根據文檔,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()