我制作了许多Python脚本,允许用户使用matplotlib.widgets(如Slider和RadioButtons)探索方程式。
我想将这些模拟发送给我的同事,但他们是忙碌的人,运行Python脚本对他们来说是一个不可逾越的障碍。所以,我希望能够以另一种格式发送我的程序,理想情况下,作为一个html页面,他们可以在浏览器中打开它们,仍然可以使用滑块和按钮。
起初,我很想发现像Holoviews和ipywidgets.StaticInteract这样的项目,它们允许您在iPython笔记本中嵌入交互元素。然而,这些要求将每个可能的绘图预先生成为图像。所以,如果我有很多滑块(我经常有10个以上的滑块并生成4个以上的图),那么该文件很快就会变得庞大。
Bokeh在网络上有很好的交互式滑块演示,但计算是由服务器完成的,我没有自己的网络服务器。 Bokeh还提供了creating custom Javascript actions的选项,它可以生成一个完全符合我想要的html文件。但是,似乎我需要做所有的计算来更新Javascript中的图,我不知道Javascript。并且,如果我确实学习了Javascript,那么看起来我可以使用d3.js制作绘图和滑块。
但我真的需要学习Javascript来做我想要的吗?简而言之:我怎样才能将这个演示(改编自matplotlib examples page)变成任何人都可以查看的网页?
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
ax = plt.subplot(111)
plt.subplots_adjust(bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5; f0 = 3; o0 = 0
s = a0*np.sin(2*np.pi*f0*t + o0)
l, = ax.plot(t,s, lw=2, color='red')
ax.set_xlim(0,1)
ax.set_ylim(-10,10)
axAmp = plt.axes([0.25, 0.15, 0.65, 0.03])
axFreq = plt.axes([0.25, 0.10, 0.65, 0.03])
axOffset = plt.axes([0.25, 0.05, 0.65, 0.03])
sFreq = Slider(axFreq, 'Freq', 0.1, 30.0, valinit=f0)
sAmp = Slider(axAmp, 'Amp', 0.1, 10.0, valinit=a0)
sOffset = Slider(axOffset, 'Offset', -10,10, valinit=o0)
def update(val):
amp = sAmp.val
freq = sFreq.val
offset = sOffset.val
l.set_ydata(amp*np.sin(2*np.pi*freq*t)+offset)
plt.draw()
sFreq.on_changed(update)
sAmp.on_changed(update)
sOffset.on_changed(update)
plt.show()