2015-01-06 2 views
2

Я пытаюсь изменить значения уровней цвета на контурном графике, заполненном matplotlib, с помощью ползунка. i контур f (x, y, z, np.linspace (a, b, n)), где ползунки будут управлять a и b и изменят уровни цвета графика при перемещении ползунка. Следующий код принимает данные, отформатированные в столбце, преобразует его в форму, требуемую контурным профилем, и затем реализуются ползунки. Это то, что я пробовал:Обновление уровней контурного графика с помощью слайдера matplotlib

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Slider 

data=np.genfromtxt('file.dat',skip_header=1) 
len=np.sqrt(data[:,0].size) 
x=np.reshape(data[:,0],(len,len))  
y=np.reshape(data[:,1],(len,len)) 
z=np.reshape(data[:,3],(len,len)) 

l=plt.contourf(x,y,z,np.linspace(0,100,255)) 

axmax = plt.axes([0.25, 0.1, 0.65, 0.03]) #slider location and size 
axmin = plt.axes([0.25, 0.15, 0.65, 0.03]) 
smax = Slider(axmax, 'Max',0, 100, 50)  #slider properties 
smin = Slider(axmin, 'Min', 0, 100, 0) 

def update(val): 
    l.levels(np.linspace(smin.val,smax.val,255))#changing levels of plot 
    fig.canvas.draw_idle()      #line that throws error 
smax.on_changed(update) 
smin.on_changed(update) 

plt.show() 

Большое количество ошибок Matplotlib выбрасываются при перемещении ползунка с соответствующими один быть «TypeError:» numpy.ndarray «объект не вызываемая», который выбрасывается по линии

fig.canvas.draw_idle() 
+0

Откуда: –

ответ

2

проблема заключается в том, что l.levels является массивом, поэтому вы должны изменить значение в этом массиве. В моем тестировании изменение этих значений не приводит к обновлению графика. Таким образом, еще одно решение - просто очистить ось и перерисовать сюжет.

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.widgets import Slider 

data=np.random.random([25,4]) 
data = data*100 
len=np.sqrt(data[:,0].size) 
x=np.reshape(data[:,0],(len,len))  
y=np.reshape(data[:,1],(len,len)) 
z=np.reshape(data[:,3],(len,len)) 

l=plt.contourf(x,y,z,np.linspace(0,100,255)) 
contour_axis = plt.gca() 

axmax = plt.axes([0.25, 0.1, 0.65, 0.03]) #slider location and size 
axmin = plt.axes([0.25, 0.15, 0.65, 0.03]) 
smax = Slider(axmax, 'Max',0, 100, 50)  #slider properties 
smin = Slider(axmin, 'Min', 0, 100, 0) 


def update(val): 
    contour_axis.clear() 
    contour_axis.contourf(x,y,z,np.linspace(smin.val,smax.val,255)) 
    plt.draw()     
smax.on_changed(update) 
smin.on_changed(update) 

plt.show() 
Смежные вопросы