如何将滑块合并到我的图中以操纵变量?
How can I incorporate a slider into my plot to manipulate a variable?
我有一个表示正弦波的图。
在代码中,我将正弦波的频率表示为变量 b
。我需要能够实时更改 b
(即无需在手动更改值后重新 运行 代码)。理想情况下,这可以通过使用滑块来完成。我尝试使用 Tkinter
的 Slider
功能,但无法将情节嵌入 Tkinter
window。
生成刺激的代码如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
vals = np.linspace(-np.pi,np.pi,100)
xgrid, ygrid = np.meshgrid(vals,vals)
b = 5
the_sine = np.sin(xgrid * b)
plt.imshow(the_sine)
fig = plt.imshow(the_sine, cm.gray)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.show()
我无法包含绘图图像,但如果您 运行 代码,您会发现这与调整简单线条之类的参数有何不同。
有什么建议吗?
继matplotlib slider for parameters之后,可以使用matplotlib.widgets.Slider
模块来更新图中包含的数据。
只需使用任意参数定义您正在绘制的函数,制作一个滑块并将其填充到您的绘图中,然后调用 fig.set_data
并在每次滑块更改时以新的滑块值评估您的函数。这是通过定义更新函数(见下文)并调用 Slider.on_changed(my_update_function)
.
来完成的
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.widgets import Slider
vals = np.linspace(-np.pi,np.pi,100)
xgrid, ygrid = np.meshgrid(vals,vals)
def f(x, y, b):
return np.sin(x * b)
b = 5
ax = plt.subplot(111)
plt.subplots_adjust(left=0.15, bottom=0.25)
fig = plt.imshow(f(xgrid, ygrid, b), cm.gray)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
axb = plt.axes([0.15, 0.1, 0.65, 0.03])
sb = Slider(axb, 'b', 0.1, 10.0, valinit=b)
def update(val):
fig.set_data(f(xgrid, ygrid, val))
sb.on_changed(update)
plt.show()
这应该会产生您正在寻找的情节,您可以在其中扫描 b
。
我有一个表示正弦波的图。
在代码中,我将正弦波的频率表示为变量 b
。我需要能够实时更改 b
(即无需在手动更改值后重新 运行 代码)。理想情况下,这可以通过使用滑块来完成。我尝试使用 Tkinter
的 Slider
功能,但无法将情节嵌入 Tkinter
window。
生成刺激的代码如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
vals = np.linspace(-np.pi,np.pi,100)
xgrid, ygrid = np.meshgrid(vals,vals)
b = 5
the_sine = np.sin(xgrid * b)
plt.imshow(the_sine)
fig = plt.imshow(the_sine, cm.gray)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.show()
我无法包含绘图图像,但如果您 运行 代码,您会发现这与调整简单线条之类的参数有何不同。
有什么建议吗?
继matplotlib slider for parameters之后,可以使用matplotlib.widgets.Slider
模块来更新图中包含的数据。
只需使用任意参数定义您正在绘制的函数,制作一个滑块并将其填充到您的绘图中,然后调用 fig.set_data
并在每次滑块更改时以新的滑块值评估您的函数。这是通过定义更新函数(见下文)并调用 Slider.on_changed(my_update_function)
.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.widgets import Slider
vals = np.linspace(-np.pi,np.pi,100)
xgrid, ygrid = np.meshgrid(vals,vals)
def f(x, y, b):
return np.sin(x * b)
b = 5
ax = plt.subplot(111)
plt.subplots_adjust(left=0.15, bottom=0.25)
fig = plt.imshow(f(xgrid, ygrid, b), cm.gray)
plt.axis('off')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
axb = plt.axes([0.15, 0.1, 0.65, 0.03])
sb = Slider(axb, 'b', 0.1, 10.0, valinit=b)
def update(val):
fig.set_data(f(xgrid, ygrid, val))
sb.on_changed(update)
plt.show()
这应该会产生您正在寻找的情节,您可以在其中扫描 b
。