2012-02-08 33 views
6

Usuario de matplotlib novato aquí. Estoy tratando de utilizar un control deslizante para ajustar un parámetro en un gráfico de contorno, pero cuando lo hago, me sale:Matplotlib: gráfico de contorno con control deslizante

AttributeError: QuadContourSet instance has no attribute 'set_data' 

sospecho que estoy llamando set_data en el objeto equivocado, pero puedo' Encuentre cualquier documentación sobre el objeto right. ¿Puede usted ayudar? Gracias.

Aquí está el código completo:

import numpy as np 
import matplotlib as mpl 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as pyl 
from matplotlib.contour import QuadContourSet 
from matplotlib.widgets import Slider 

#Define display parameters 
mpl.rcParams['xtick.direction'] = 'out' 
mpl.rcParams['ytick.direction'] = 'out' 
delta = 0.025 

#Define model parameters 
alpha = .5 
beta = .5 
x_bar, a, b, c = 2, 0, 1, .1 
v = np.arange(0, 10, delta) 
w = np.arange(0, 10, delta) 

#Calculate grid values 
V, W = np.meshgrid(v,w) 
Z = (V**(beta))*(W**(1-beta)) 
X = x_bar + a + b*Z 
U = alpha*np.log(V) + (1-alpha)*np.log(X) - c*(W+V) 

# Plot 
fig = pyl.figure() 

ax = fig.add_subplot(221) 
CS = QuadContourSet(pyl.gca(), V, W, U, 200) 
pyl.clabel(CS, inline=1, fontsize=10) 
pyl.title('Simplest default with labels') 

#Define slider for alpha 
axcolor = 'lightgoldenrodyellow' 
alpha_axis = pyl.axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) 
alpha_slider = Slider(alpha_axis, 'Amp', 0, 1, valinit=.5) 

def update(val): 
    alpha = alpha_slider.val 
    U = alpha*np.log(V) + (1-alpha)*np.log(X) - c*(W+V) 
    CS.set_data(V, W, U) 
    pyl.draw() 

alpha_slider.on_changed(update) 

pyl.show() 

Respuesta

3

El problema es que el objeto QuadContourSet no tiene manera de actualizar sus datos, ya que si cambia los datos de forma arbitraria, todo el asunto necesita ser recalculado. No sé si hay algo en su forma particular de generar datos que se prestaría a una manera más simple de modificar las curvas de nivel, pero si no, creo que lo que debe hacer es trazar los contornos desde cero:

# After your "Define model parameters" block 

def compute_and_plot(ax, alpha): 
    #Calculate grid values 
    V, W = np.meshgrid(v,w) 
    Z = (V**(beta))*(W**(1-beta)) 
    X = x_bar + a + b*Z 
    U = alpha*np.log(V) + (1-alpha)*np.log(X) - c*(W+V) 

    CS = QuadContourSet(ax, V, W, U, 200) 
    pyl.clabel(CS, inline=1, fontsize=10) 

# Plot 
fig = pyl.figure() 
pyl.title('Simplest default with labels') 
ax = fig.add_subplot(221) 
compute_and_plot(ax, alpha) 

#Define slider for alpha 
axcolor = 'lightgoldenrodyellow' 
alpha_axis = pyl.axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) 
alpha_slider = Slider(alpha_axis, 'Amp', 0, 1, valinit=.5) 

def update(ax, val): 
    alpha = alpha_slider.val 
    ax.cla() 
    compute_and_plot(ax, alpha) 
    pyl.draw() 

alpha_slider.on_changed(lambda val: update(ax, val)) 

pyl.show() 
Cuestiones relacionadas