带有两个滑块的交互式 matplotlib 图 [英] Interactive matplotlib plot with two sliders
问题描述
我使用 matplotlib 创建了一些绘图,这取决于 8 个变量.我想研究当我改变其中一些时,情节如何变化.我创建了一些脚本,调用 matplotlib 并生成不同的快照,然后我将其转换为电影,这还不错,但有点笨拙.
I used matplotlib to create some plot, which depends on 8 variables. I would like to study how the plot changes when I change some of them. I created some script that calls the matplotlib one and generates different snapshots that later I convert into a movie, it is not bad, but a bit clumsy.
我想知道是否可以通过键盘按键与绘图再生交互以增加/减少某些变量的值,并立即查看绘图如何变化.
I wonder if somehow I could interact with the plot regeneration using keyboard keys to increase / decrease values of some of the variables and see instantly how the plot changes.
最好的方法是什么?
另外,如果您能指出我感兴趣的链接或带有只有两个滑块的绘图示例的链接吗?
Also if you can point me to interesting links or a link with a plot example with just two sliders?
推荐答案
除了@triplepoint 提到的,看看滑块小部件.
In addition to what @triplepoint mentioned, have a look at the slider widget.
在 matplotlib 示例页面上有一个 示例.它是一个图形滑块而不是键盘绑定,但它非常适合您想要做的事情.
There's an example on the matplotlib examples page. It's a graphical slider bar rather than keyboard bindings, but it works quite well for what you want to do.
另请注意,为确保滑块和按钮保持响应状态且不被垃圾收集,对对象(amp_slider
、freq_slider
等)的引用应由自己.
Also note that to guarantee the sliders and buttons remain responsive and not garbage-collected, references to the objects (amp_slider
, freq_slider
, etc.) should be maintained by yourself.
(我正在制作这个社区维基,因为我只是从示例中复制粘贴.这个特定示例教坏习惯(例如 该示例已被修复以避免使用 from pylab import *
),但它明白了.pylab
.)
(I'm making this community wiki, as I'm just copy-pasting from the example. This particular example teaches bad habits (e.g. The example has been fixed to avoid the use of from pylab import *
), but it gets the point across.pylab
.)
from numpy import pi, sin
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
def signal(amp, freq):
return amp * sin(2 * pi * freq * t)
axis_color = 'lightgoldenrodyellow'
fig = plt.figure()
ax = fig.add_subplot(111)
# Adjust the subplots region to leave some space for the sliders and buttons
fig.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
amp_0 = 5
freq_0 = 3
# Draw the initial plot
# The 'line' variable is used for modifying the line later
[line] = ax.plot(t, signal(amp_0, freq_0), linewidth=2, color='red')
ax.set_xlim([0, 1])
ax.set_ylim([-10, 10])
# Add two sliders for tweaking the parameters
# Define an axes area and draw a slider in it
amp_slider_ax = fig.add_axes([0.25, 0.15, 0.65, 0.03], facecolor=axis_color)
amp_slider = Slider(amp_slider_ax, 'Amp', 0.1, 10.0, valinit=amp_0)
# Draw another slider
freq_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], facecolor=axis_color)
freq_slider = Slider(freq_slider_ax, 'Freq', 0.1, 30.0, valinit=freq_0)
# Define an action for modifying the line when any slider's value changes
def sliders_on_changed(val):
line.set_ydata(signal(amp_slider.val, freq_slider.val))
fig.canvas.draw_idle()
amp_slider.on_changed(sliders_on_changed)
freq_slider.on_changed(sliders_on_changed)
# Add a button for resetting the parameters
reset_button_ax = fig.add_axes([0.8, 0.025, 0.1, 0.04])
reset_button = Button(reset_button_ax, 'Reset', color=axis_color, hovercolor='0.975')
def reset_button_on_clicked(mouse_event):
freq_slider.reset()
amp_slider.reset()
reset_button.on_clicked(reset_button_on_clicked)
# Add a set of radio buttons for changing color
color_radios_ax = fig.add_axes([0.025, 0.5, 0.15, 0.15], facecolor=axis_color)
color_radios = RadioButtons(color_radios_ax, ('red', 'blue', 'green'), active=0)
def color_radios_on_clicked(label):
line.set_color(label)
fig.canvas.draw_idle()
color_radios.on_clicked(color_radios_on_clicked)
plt.show()
这篇关于带有两个滑块的交互式 matplotlib 图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!