带有两个滑块的交互式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.
(我正在制作此社区Wiki,因为我只是从示例中复制粘贴. >已修复该示例,以避免使用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], axisbg=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], axisbg=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], axisbg=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屋!