我正在尝试创建一个仪表板,其中包含在jupyter笔记本中的图形对象和ipython小部件。
当使用@interact
装饰器使用某些使用这些窗口小部件生成可打印图形对象的函数时,一切工作正常,即在执行单元格后立即显示其预期输出图形。
但是,如果我将整个函数和小部件放在VBox
小部件以及应包含图形的Output
小部件中,则当第一个单元格执行时,该函数不会显示任何图表时间(请参见下图),并且只有在与其小部件进行交互之后,我才能刷新图表。
我在这里包括我的代码,它不可复制,对此我深表歉意,但是我希望有人能发现它的问题。
daily_tab = widgets.VBox()
daily_out = widgets.Output(layout = {
'width': '100%',
'height': '600px',
'border': '1px solid black'
})
def get_values_for_day(regions,labels,date,cases_per_mln_people,show_grid):
with daily_out:
clear_output()
data_columns = orig_data_columns+extra_data_columns
if len(regions) == 0:
regions = ['Italy']
regions = list(regions)
if len(labels) == 0:
labels = [item for item in data_columns if ('daily' in item) & ('%' not in item)]
labels = list(labels)
mult = 1.
fig = go.Figure()
for region in regions:
if cases_per_mln_people:
mult = 1e06/ita_populations.loc[region, 'Popolazione']
for item in labels:
df_reg[region].index = pd.to_datetime(df_reg[region].index)
fig.add_traces(go.Bar(y=labels, x=df_reg[region][labels].loc[date]*mult, name=region, orientation='h'))
fig.update_layout(showlegend=True,title='day ' + str(date.strftime("%m/%d/%Y")),
paper_bgcolor='rgba(0,0,0,0)',font = dict(color = 'lightgray'),plot_bgcolor='rgba(0,0,0,0)')
fig.update_xaxes(showgrid=show_grid, gridwidth=1, gridcolor='lightgray')
fig.update_yaxes(showgrid=show_grid, gridwidth=1, gridcolor='lightgray')
fig.show()
daily_widget = interactive(get_values_for_day,
regions = widgets.SelectMultiple(description="regions",
options=list(df_reg.keys()), value=['Italy']),
labels = widgets.SelectMultiple(description="data",
options=orig_data_columns+extra_data_columns,
value=['Rth']),
date=widgets.DatePicker(description='Pick a Date',
value=pd.to_datetime(df_prov.index.max())),
cases_per_mln_people=False,
show_grid=False)
daily_box = widgets.HBox(daily_widget.children[:-1], layout = widgets.Layout(flex_flow='row wrap'))
daily_tab.children = [daily_box, daily_out]
这是单元格第一次执行时的输出:
以下是与各种小部件控件进行交互后的输出:
在第一次调用时,该函数如何在给定默认参数的情况下打印期望的输出,而无需强制调用?
答案 0 :(得分:0)
我在使用图和Output
小部件时遇到了类似的麻烦。 Output
的内部渲染例程与plotly / bqplot / plt不能一起很好地工作。
您可以直接将go.figure()
声明为小部件,并绕过Output
小部件。看起来像这样:
daily_tab = widgets.VBox()
fig_output = go.figure()
def get_values_for_day(regions,labels,date,cases_per_mln_people,show_grid, fig_output):
clear_output()
data_columns = orig_data_columns+extra_data_columns
(...)
# replace all occurences of fig with fig_output. Don't use fig_output.show()
fig_output.update_xaxes(showgrid=show_grid, gridwidth=1, gridcolor='lightgray')
daily_tab.children = [daily_box, fig_output]
也许需要一些细微的调整才能使它起作用,但是我无法使用提供的代码对其进行测试。