2016-03-22 3 views
4

В следующем коде представлена ​​интерактивная фигура, в которой я могу включить или выключить определенные линии. Это отлично работает, когда я работаю в ноутбуке IPythonЭкспорт интерактивного ноутбука Jupyter в html

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.88700001, 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, чтобы поделиться с коллегами, которые ничего не знают о питоне. Как я могу экспортировать ноутбук в html и заставить его поддерживать интерактивную (переключаемую) функциональность (которая в настоящее время проигрывает)? Благодаря!

+1

Для функции переключения, это должно быть связано с запущенным процессом Python - экспорт HTML является статическим представлением документа без подключения к ядру. Вы можете посмотреть экспериментальный проект [jupyter-dashboards] (https://github.com/jupyter-incubator/dashboards). Или вы можете найти способ построения с интерактивностью в Javascript, чтобы он работал без использования ядра. –

+0

В зависимости от того, насколько вы комфортно работаете с javascript, вы можете следить за этим [https://jakevdp.github.io/blog/2013/12/05/static-interactive-widgets/] блогом о том, как сделать статические интерактивные виджеты, используя ipywidgets. Это потребует внесения некоторых изменений в ваш код, но должно быть выполнимо. – nluigi

+0

Спасибо. 'StaticInteract' больше не существует в ipywidgets. Любая идея, что такое замена? –

ответ

0

Возможно, вам не нужно экспортировать ноутбук jupyter в html, но поделитесь записью ноутбука с другими людьми, и они могут посетить URL-адрес, используя свой браузер.

Плагин для ноутбука Jupyter поможет вам сделать это более эффективно: jupyter/dashboards, он поддерживается официальной командой jupyter, и это помогает вам делиться своим ноутбуком, как с отчетом, и вы можете контролировать, какую ячейку отображать и местоположение каждой ячейки отображается. Стоит попробовать!

Смежные вопросы