当以html

时间:2019-04-12 17:55:39

标签: python python-3.x jupyter-notebook ipython plotly

我正在使用Jupyter Notebook并试图创建一个交互式绘图。我非常喜欢ipywidgets.interactive的使用非常简单,并且能够将内容放置在VBoxHBox中。我遇到的问题是,一旦我以html格式下载后,ipywidgets.interactive并没有更新绘图。

这是我所拥有的:

from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
import plotly.graph_objs as go
import plotly.offline as py
import numpy as np
from IPython.display import display

py.init_notebook_mode()

xs = np.linspace(0,6,100)
ys = np.sin(xs)

scatter = go.Scatter(
    x = xs,
    y = ys
)

data = [scatter]
layout = go.Layout(title='test')

fig = go.FigureWidget(data=data, layout=layout)
slider = widgets.FloatRangeSlider(
    min=1,
    max=6,
    step=.1,
    description='desc'
)

def update_b(b):
    fig.data[0].y = np.sin(xs+b)

vb = widgets.VBox((fig, interactive(update_b, b=(1, 6, .1))))
vb.layout.align_items='center'
# This displays it and allows it to be interactive, but only when I have it as .ipynb, 
# not when I download as html
display(vb) 

我另存为html的方式是:
1. Widgets> Save Notebook Widget State
2.从cmd:jupyter nbconvert --to html test_plot.ipynb

我还做了以下操作来启用widget extension

jupyter nbextension enable --py widgetsnbextension
Enabling notebook extension jupyter-js-widgets/extension...
      - Validating: ok

这是我得到的一切: enter image description here

问题是滑块是可移动的,但不会更新图形。该图还可以通过缩放等方式进行操作,就像通常使用plotly一样。这使我相信使用interactive的方式存在问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不幸的是,这种方式无法正常工作,将滑块与绘图链接的功能是用python编写的,并在python内核中执行,因此当您转换为静态html时,此功能将不再存在。

我不知道某种python到javascript的翻译器,该类翻译器允许这些函数在没有python内核的情况下运行,尽管plotly的Dash似乎在这一行中做了一些事情(see this issue 。如果可以安装服务器,则可以使用Voila或类似的方法使笔记本看起来像网页。

答案 1 :(得分:0)

我不使用图,但是,请尝试添加一些线魔术,例如“ widget”,它使图形具有交互性...

%matplotlib widget
%matplotlib widget
from ipywidgets import *
import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(0, 2 * np.pi)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
line, = ax.plot(x, np.sin(x))

def update(w = 1.0):
    line.set_ydata(np.sin(w * x))
    fig.canvas.draw()

interact(update);

screenshot of notebook