Plotly Dash:仅当Pandas DataFrame中的某些数据存在时才渲染图形

时间:2018-01-30 17:37:02

标签: python plotly plotly-dash

我目前使用Plotly Dash创建一个webapp来可视化数据。 语法涉及使用dcc.Graph呈现HTML Div,如下所示。 html.Div下面是渲染绘图的代码。 x轴和y轴值来自Pandas DF。 任何人都可以推荐一种方法来使用IF语句检查给定列是否存在,然后继续返回以下代码。 当一个'无花果时,Plotly Dash会出错。变量不存在

html.Div([
    html.Div([
        html.H3('Chart'),
        dcc.Graph(id='Chart',figure = chart_fig
)



sensor3_trace_day1 = Scatter(
y = sensor_3_day1['BG Calibration (mg/dl)'],
x = sensor_3_day1['Current (nA)'],
mode = 'markers',
name = 'Sensor 3 Day 1'
)    
data = [sensor1_trace]

layout = Layout(showlegend=True, height = 600, width = 600, title='Day     1: BG Cal vs Current',xaxis={'title':'Current [nA]'},yaxis={'title':'BG Calibration (mg/dl)'})

chart_fig = dict(data=data, layout=layout)

iplot(chart_fig)

2 个答案:

答案 0 :(得分:1)

你可以做的是使用两个不同的@app.callbacks()。第一个将返回一个数字,第二个将返回"样式" dcc.Graph()对象的字典。如果数字是空的,你不想显示div。如果您有一个下拉列表或用于更新信息的按钮,即读入/创建数据帧,您可以将其用作回调的输入。例如:

html.Div([
    html.Div([
        html.H3('Chart'),
        dcc.Graph(id='chart')
         ]),
     ])

@app.callback(Output('chart','figure'),
              [Input('dropdown','value')])
def update_fig(drop_val):
    if "col" in df.columns:
        fig = {'data':data,'layout':layout}
    else:
        fig = {'data':[],'layout':layout}
    return fig

@app.callback(Output('chart','style'),
              [Input('dropdown','value')])
def update_style(drop_val):
    if "col" in df.columns:
        style = {'borderStyle':solid,'display':'inline-block'}
    else:
        style = {'display':'none'}
    return style

在这种情况下,我有一些虚构的下拉列表可能会在读取df或其他内容之间翻转,然后每次输出显示和数字。无论如何构成,它必须返回一个可行的数字

data = [{'x':[1,2,4], 'y':[4,5,6], 'type':'bar'}]

或类似的东西,只需将显示设置为"none",这样就不会呈现。

答案 1 :(得分:0)

另一种可能的解决方案是在某些条件下创建回调并显示空图。 此示例与@lwileczek的示例非常相似

def empty_plot(label_annotation):
    '''
    Returns an empty plot with a centered text.
    '''

    trace1 = go.Scatter(
        x=[],
        y=[]
    )

    data = [trace1]

    layout = go.Layout(
        showlegend=False,
        xaxis=dict(
            autorange=True,
            showgrid=False,
            zeroline=False,
            showline=False,
            ticks='',
            showticklabels=False
        ),
        yaxis=dict(
            autorange=True,
            showgrid=False,
            zeroline=False,
            showline=False,
            ticks='',
            showticklabels=False
        ),
        annotations=[
            dict(
                x=0,
                y=0,
                xref='x',
                yref='y',
                text=label_annotation,
                showarrow=True,
                arrowhead=7,
                ax=0,
                ay=0
            )
        ]
    )

    fig = go.Figure(data=data, layout=layout)
    # END
    return fig

# Layout
html.Div([
    html.Div([
        # Here it goes the dropdown menu
        # ....

        # The graph is defined below
        html.H3('Chart'),
        dcc.Graph(id='chart')
         ]),
     ])

# Callback
@app.callback(Output('chart','figure'),
              [Input('dropdown','value')])
def update_fig(drop_val):
    if drop_val in df.columns:
        # fig = (...)  Here it goes your figure
    else:
        fig = empty_plot('Nothing to display') # Here it goes the empty plot
    return fig