如何在我的绘图中加入滑块来操作变量?

时间:2015-06-23 21:18:11

标签: python tkinter slider

我有一个代表正弦波的情节。

在代码中,我将正弦波的频率表示为变量b。我需要能够实时更改b(即无需在手动更改值后重新运行代码)。理想情况下,这可以通过使用滑块来完成。我尝试使用Tkinter Slider功能,但无法在Tkinter窗口中嵌入该图。

生成刺激的代码如下:

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

我无法包含绘图的图像,但如果您运行代码,您将看到这与调整类似简单线的参数有点不同。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

关注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