matplotlib小部件Slider演示源代码说明

时间:2017-06-10 03:31:29

标签: python matplotlib widget

我试图理解source code能够使用matplotlib的Slider小部件。定义函数update()的代码段确实困扰我:

我没有看到在val中使用参数def update(val):,而val的值在任何地方都没有被引用。问题与def reset(event):功能相同。到目前为止,我做过一些简单的测试:

  1. val参数的名称更改为其他随机单词,例如def update(wtf):,而不更改函数的正文。生成的代码仍然可以正常工作。
  2. 在不更改函数体的情况下,为参数添加一些默认值,例如def update(wtf=None):。生成的代码仍然可以正常工作。
  3. 只需删除参数即可。 def update():。 Slider NO LONGER会更改绘图,这意味着脚本无法正常工作。
  4. 我不明白这个update函数或val参数是如何工作的。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

on_changed回调将为该函数提供滑块的当前值。因此update函数需要一个参数。此参数未在示例中使用的原因是update函数需要两个滑块的值,而不管哪个滑块更改,因此直接从Slider实例中获取值。

为了更好地理解滑块的工作方式,可以考虑以下简化版本:

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

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
s = np.sin(6*np.pi*t)
l, = plt.plot(t, s, lw=2, color='red')
plt.axis([0, 1, -1.2, 1.2])

axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor="lightblue")
sfreq = Slider(axfreq, 'Freq', 0.1, 20.0, valinit=3)

def update(val):
    l.set_ydata(np.sin(2*np.pi*val*t))
    fig.canvas.draw_idle()

sfreq.on_changed(update)

plt.show()

这里只有一个滑块,值传递给update函数,用于计算新的ydata值。

非常明显地,按钮的on_click回调将click事件传递给函数。在这种情况下,这是非常无用的,但可能会用于查看,使用了哪个鼠标按钮,或者确切地发生了点击。

def reset(event):
    if event.button == 1:
        sfreq.reset()
        samp.reset()
    else:
        print("Please use the left mouse button")
button.on_clicked(reset)

答案 1 :(得分:0)

@Ding是对的。转到实现link(逻辑顺序为第435行| 411-> 425),调用函数update,并更新Slider的当前值。但是,传递的值不是直接使用的。而是通过全局变量引用在用户定义的update函数中直接引用Slider的当前值。