将交互式Jupyter Notebook导出为HTML

8
以下代码绘制了一个交互式图形,我可以切换特定线条的开关。当我在Ipython Notebook上工作时,这个功能完美地运行。
import pandas as pd
import numpy as np
from itertools import cycle
import matplotlib.pyplot as plt, mpld3
from matplotlib.widgets import CheckButtons
import matplotlib.patches
import seaborn as sns
%matplotlib nbagg
sns.set(style="whitegrid")
df = pd.DataFrame({'freq': {0: 0.01, 1: 0.02, 2: 0.029999999999999999, 3: 0.040000000000000001, 4: 0.050000000000000003, 5: 0.059999999999999998, 6: 0.070000000000000007, 7: 0.080000000000000002, 8: 0.089999999999999997, 9: 0.10000000000000001, 10: 0.01, 11: 0.02, 12: 0.029999999999999999, 13: 0.040000000000000001, 14: 0.050000000000000003, 15: 0.059999999999999998, 16: 0.070000000000000007, 17: 0.080000000000000002, 18: 0.089999999999999997, 19: 0.10000000000000001, 20: 0.01, 21: 0.02, 22: 0.029999999999999999, 23: 0.040000000000000001, 24: 0.050000000000000003, 25: 0.059999999999999998, 26: 0.070000000000000007, 27: 0.080000000000000002, 28: 0.089999999999999997, 29: 0.10000000000000001}, 'kit': {0: 'B', 1: 'B', 2: 'B', 3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'B', 8: 'B', 9: 'B', 10: 'A', 11: 'A', 12: 'A', 13: 'A', 14: 'A', 15: 'A', 16: 'A', 17: 'A', 18: 'A', 19: 'A', 20: 'C', 21: 'C', 22: 'C', 23: 'C', 24: 'C', 25: 'C', 26: 'C', 27: 'C', 28: 'C', 29: 'C'}, 'SNS': {0: 91.198979591799997, 1: 90.263605442199989, 2: 88.818027210899999, 3: 85.671768707499993, 4: 76.23299319729999, 5: 61.0969387755, 6: 45.1530612245, 7: 36.267006802700003, 8: 33.0782312925, 9: 30.739795918400002, 10: 90.646258503400006, 11: 90.306122449, 12: 90.178571428600009, 13: 89.498299319699996, 14: 88.435374149599994, 15: 83.588435374200003, 16: 75.212585034, 17: 60.969387755100001, 18: 47.278911564600001, 19: 37.627551020399999, 20: 90.986394557800011, 21: 90.136054421799997, 22: 89.540816326499993, 23: 88.690476190499993, 24: 86.479591836799997, 25: 82.397959183699996, 26: 73.809523809499993, 27: 63.180272108800004, 28: 50.935374149700003, 29: 41.241496598699996}, 'FPR': {0: 1.0953616823100001, 1: 0.24489252678500001, 2: 0.15106142277199999, 3: 0.104478605177, 4: 0.089172822253300005, 5: 0.079856258734300009, 6: 0.065881413455800009, 7: 0.059892194050699996, 8: 0.059892194050699996, 9: 0.0578957875824, 10: 0.94097291541899997, 11: 0.208291741532, 12: 0.14773407865800001, 13: 0.107805949291, 14: 0.093165635189999998, 15: 0.082518134025399995, 16: 0.074532508152000007, 17: 0.065881413455800009, 18: 0.062554069341799995, 19: 0.061888600519100001, 20: 0.85313103081100006, 21: 0.18899314567100001, 22: 0.14107939043000001, 23: 0.110467824582, 24: 0.099820323417899995, 25: 0.085180009316599997, 26: 0.078525321088700001, 27: 0.073201570506399985, 28: 0.071870632860800004, 29: 0.0705396952153}})

tableau20 = ["#6C6C6C", "#92D050", "#FFC000"]
tableau20 = cycle(tableau20)

kits = ["A","B", "C"]
color = iter(["#6C6C6C", "#92D050", "#FFC000"])
fig = plt.figure(figsize=(12,8))
for kit in kits:
    colour = next(color)
    for i in df.groupby('kit'):
        grouped_df = pd.DataFrame(np.array(i[1]), columns = 
                      ['freq', 'SNS', 'FPR', 'kit'])
        if grouped_df.kit.tolist()[1] == kit:
            x = [float(value) for i, value in enumerate(grouped_df.FPR)]
            y = [float(value) for i, value in enumerate(grouped_df.SNS)]
            x, y = (list(x) for x in zip(*sorted(zip(x, y))))
            label = grouped_df['kit'].tolist()[1]
            p = plt.plot(x, y, "-o",label = label, color = colour)

labels = [label.get_text() for label in plt.legend().texts]
plt.legend().set_visible(False)
for i, value in enumerate(labels):
    exec('label%s="%s"'%(i, value))

for i in range(len(labels)):
    exec('l%s=fig.axes[0].lines[i]'%(i))

rax = plt.axes([0.92, 0.7, 0.2, 0.2], frameon=False)
check = CheckButtons(rax, (labels), ('True ' * len(labels)))
for i, rec in enumerate(check.rectangles):
     rec.set_facecolor(tableau20.next())

def func(label):
    for i in range(len(labels)):
        if label == eval('label%s'%(i)): eval('l%s.set_visible(not l%s.get_visible())'%(i,i))

    plt.draw()
check.on_clicked(func)

plt.show()

问题在于,我需要将笔记本导出为HTML以与对Python一无所知的同事共享。我该如何将笔记本导出为HTML,并使其保留交互式(切换)功能(目前它会丢失)?谢谢!


1
对于切换功能,它必须与正在运行的Python进程通信 - HTML导出是文档的静态视图,没有与内核的连接。您可以查看实验性的jupyter-dashboards项目。或者您可能能够找到一种使用JavaScript进行交互式绘图的方法,以便无需内核即可工作。 - Thomas K
根据您对JavaScript的熟悉程度,您可以参考博客了解如何使用ipywidgets创建静态交互式小部件。这将需要对您的代码进行一些修改,但应该是可行的。 - nluigi
谢谢。StaticInteract 在 ipywidgets 中似乎不再存在了。有什么替代品吗? - Michael Berry
1个回答

1
也许你不需要将jupyter notebook导出为html,而是将笔记本链接分享给其他人,他们可以使用浏览器访问该网址。
一个jupyter notebook插件可以帮助你更有效地做到这一点:jupyter/dashboards,它由官方的jupyter团队维护,它可以帮助你像报告一样分享你的笔记本,并且你可以控制显示哪个单元格以及每个单元格显示的位置。值得一试!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接