简体   繁体   English

Matplotlib:带滑块小部件的等高线图

[英]Matplotlib: contour plot with slider widget

Newbie matplotlib user here. 新手matplotlib用户在这里。 I'm trying to use a slider to adjust a parameter in a contour plot, but when I do so, I get: 我正在尝试使用滑块来调整等高线图中的参数,但是当我这样做时,我得到:

AttributeError: QuadContourSet instance has no attribute 'set_data'

I suspect that I'm calling set_data on the wrong object, but I can't find any documentation on what the right object is. 我怀疑我在错误的对象上调用set_data,但我找不到任何关于正确对象的文档。 Can you help? 你能帮我吗? Thanks. 谢谢。

Here's the full code: 这是完整的代码:

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

The problem is that the QuadContourSet object has no way to update its data, since if you change the data arbitrarily, the whole thing needs to be recomputed. 问题是QuadContourSet对象无法更新其数据,因为如果您任意更改数据,则需要重新计算整个数据。 I don't know if there is something about your particular way of generating data that would lend itself to a simpler way to modify the contour lines, but if not, I think what you need to do is to plot the contours from scratch: 我不知道你的特定数据生成方式是否有一些东西可以用来修改轮廓线的简单方法,但如果没有,我认为你需要做的是从头开始绘制轮廓:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM