2012-02-08 32 views
6

Người dùng mới matplotlib ở đây. Tôi đang cố gắng sử dụng một thanh trượt để điều chỉnh một tham số trong một âm mưu đường viền, nhưng khi tôi làm như vậy, tôi nhận được:Matplotlib: ô đường viền với tiện ích con trượt

AttributeError: QuadContourSet instance has no attribute 'set_data' 

tôi nghi ngờ rằng tôi đang kêu gọi set_data trên đối tượng sai, nhưng tôi có thể' t tìm thấy bất kỳ tài liệu nào về đối tượng phải. Bạn có thể giúp? Cảm ơn.

Dưới đây là đoạn code đầy đủ:

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() 

Trả lời

3

Vấn đề là đối tượng QuadContourSet không có cách nào để cập nhật dữ liệu của nó, vì nếu bạn thay đổi dữ liệu tùy tiện, toàn bộ điều cần phải được tính toán lại. Tôi không biết nếu có một cái gì đó về cách cụ thể của bạn tạo ra dữ liệu mà sẽ cho vay một cách đơn giản để sửa đổi các đường đồng mức, nhưng nếu không, tôi nghĩ rằng những gì bạn cần làm là để vẽ các đường nét từ đầu:

# 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() 
Các vấn đề liên quan