【问题标题】:ipywidgets and plotly not showing their output after first callipywidgets 并在第一次调用后不显示其输出
【发布时间】:2020-06-02 19:56:56
【问题描述】:

我正在尝试在 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]

这是单元格第一次执行时的输出:

这是与各种小部件控件交互后的输出:

在第一次调用时,如何让函数在给定默认参数的情况下打印预期输出而不需要强制调用?

【问题讨论】:

    标签: python plotly jupyter ipywidgets


    【解决方案1】:

    我在使用 plots 和 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]
    

    可能需要进行一些小的调整才能使其正常工作,但我无法使用提供的代码对其进行测试。

    【讨论】:

    • 谢谢!这似乎是有道理的,虽然我得到: TraitError: Element of the 'children' trait of a VBox instance must be a Widget, but a value of Figure({ 'data': [], 'layout': {'template ': '...'} }) 被指定。似乎 Plotly 中的 Graph 对象似乎不被接受为小部件内子项的一部分
    • 我的错。我没有在这种情况下使用 plotly 。请尝试 go.FigureWidget() 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2021-06-13
    • 1970-01-01
    • 2016-01-29
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多