将matplotlib滑块转换为网页

时间:2015-09-24 18:25:55

标签: javascript python matplotlib ipython ipython-notebook

我制作了许多Python脚本,允许用户使用matplotlib.widgets(如Slider和RadioButtons)探索方程式。

我想将这些模拟发送给我的同事,但他们是忙碌的人,运行Python脚本对他们来说是一个不可逾越的障碍。所以,我希望能够以另一种格式发送我的程序,理想情况下,作为一个html页面,他们可以在浏览器中打开它们,仍然可以使用滑块和按钮。

起初,我很想发现像Holoviewsipywidgets.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()

enter image description here

0 个答案:

没有答案