Я создал блокнот, который должен отображать графики в виджете вкладок. Насколько я понимаю, чтобы включить что-то вроде графиков в виджет вкладки, мне нужно обернуть его в виджет вывода. В самом ноутбуке он работает, но когда я конвертирую его в html через nbconvert, он дает неправильный вывод.
Виджеты, такие как ползунки, кнопки или текст, появляются внутри виджета вкладки там, где они должны, но когда я использую виджет вывода, чтобы поймать график (или даже некоторый текст из функции print ()), он появляется перед средой вкладки, которая сама тогда пуста .
Вот как это должно выглядеть с одним графиком на вкладке (работает в записной книжке): Графики во вкладках внутри блокнот
И вот как это выглядит после nbconvert (в html). Графики появляются перед вкладкой envorinment: Графики перед вкладками в html
Обратите внимание, что nbconvert включает в себя и другие виджеты, а также вкладки с другим контентом.
Это используемый код:
# Import libraries
import pandas as pd
import matplotlib.pyplot as plt
import ipywidgets as widgets
import numpy as np
# Generated data for plotting
data = pd.DataFrame()
for i in range(5):
data[i] = np.random.normal(size = 50)
Теперь эта часть работает в записной книжке, но не в html, но, как вы увидите, похоже, она связана с виджетом вывода, поскольку я не работаю с графиками или печатным текстом.
# This does not work with plots
children = []
for i in range(data.shape[1]):
out = widgets.Output()
with out:
fig, axes = plt.subplots()
data[i].hist(ax = axes)
plt.show()
children.append(out)
tab = widgets.Tab()
tab.children = children
for i in range(len(children)):
tab.set_title(i, "Plot " + str(i))
tab
# And this does not work with printed output
children = []
for i in range(5):
out = widgets.Output()
with out:
print("This is text", i)
children.append(out)
tab = widgets.Tab()
tab.children = children
for i in range(len(children)):
tab.set_title(i, "Text " + str(i))
tab
Однако, если я использую другой тип виджета (например, текст), он правильно отображается в записной книжке и выводе html из nbconvert.
# This works with the Text widget
children = []
for i in range(5):
out = widgets.Text(description="P"+str(i))
children.append(out)
tab = widgets.Tab()
tab.children = children
for i in range(len(children)):
tab.set_title(i, "Text " + str(i))
tab
Итак, могу ли я что-то изменить, чтобы это действительно работало? В конце концов, мне нужен способ отображения N графиков на N вкладках ...
--ExecutePreprocessor.store_widget_state=True
, он сохраняет состояние, но вывод идет не в ту ячейку. Единственное решение прямо сейчас - открыть Jupyter Notebook и запустить его вручную, затем перейти в Виджеты ›Сохранить состояние виджета. Затем используйте nbconvert, который покажет результат там, где он должен быть. Я думаю, проблема в том, что у nbconvert нет JS-движка (по понятным причинам), поэтому делать то, что мы хотим, невозможно. - person danielfrg   schedule 20.12.2019