2013-10-11 2 views
0

Я пытаюсь использовать ползунок, чтобы изменить пределы для масштабирования цвета, используя функцию set_clim (min, max). Я хочу, чтобы два ползунка управляли значениями для минимальных и максимальных значений, а после того, как они изменились, фигура будет заменена.Использование ползунка для изменения переменной и replot Matplotlib figure

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import cm 
from matplotlib.widgets import Slider, Button 

x=np.linspace(0,100,100) 
y=np.linspace(0,100,100) 
z=np.zeros((100,100)) 
for i in range (0,100): 
    for j in range (0,100): 
     z[i,j]=np.random.random() 

fig, ax = plt.subplots() 
plt.subplots_adjust(left=0.25, bottom=0.25) 
l=plt.contourf(x,y,z) 

axmax = plt.axes([0.25, 0.1, 0.65, 0.03]) 
axmin = plt.axes([0.25, 0.15, 0.65, 0.03]) 

smax = Slider(axmax, 'Max', 0, 1.0, valinit=1) 
smin = Slider(axmin, 'Min', 0, 1.0, valinit=0) 
def update(val): 
    fig.set_clim(smin.val,smax.val) 
    fig.canvas.draw_idle() 
smax.on_changed(update) 
smin.on_changed(update) 
plt.show() 

Приведенный выше код дает мне «AttributeError: объект„AxesSubPlot“не имеет атрибута„set_clim“», когда я двигаю ползунки, хотя он показывает мне первоначальный неизменный показатель. Это мой первый раз, когда я использовал виджеты в python (и более или менее первый раз использовал python), поэтому вполне могут быть некоторые фундаментальные недоразумения.

ответ

3

Проблема в том, что ошибка говорит вам, что объекты axes не имеют функции set_clim. Вы хотите изменить (что делает ошибку вы сообщаете на одном я ожидаю, но)

fig.set_clim(smin.val,smax.val) 

в

l.set_clim(smin.val,smax.val) 

, как вам нужно вызвать set_clim на ScalarMappable объекта (doc).

В качестве примечания, np.random.random принимает размер arguement, так что вы можете сделать

z = np.random.random((100, 100)) 

вместо ваших вложенных циклов.

+0

+1 к использованию 'size' arg, чтобы избавиться от этих циклов –

Смежные вопросы