【问题标题】:Plotly-Dash: Adding new yaxis per selected df columnPlotly-Dash:为每个选定的 df 列添加新的 yaxis
【发布时间】:2019-11-22 09:06:09
【问题描述】:

我有一个基本的 dash 应用程序,它可以从数据框字典中绘制一些数据。第一个下拉列表选择 df,而第二个下拉列表选择要绘制的 df 列。

这很好用,但我似乎无法为每个绘制的列添加新的 y 轴。我在每个 df 中有大量列,它们会根据所选的 df 而变化。

首先,我尝试在定义 x、y 和名称后更改 updateGraph 回调以包含 yaxis=i。查看文档,似乎我可以在go.Scatter 中定义yaxis,但我需要将它们设置为'y2'、'y3、'y4'等。我还尝试通过@987654323 更新布局@以这种方式,但都没有奏效。代码如下,其中dict_main 是各种大小数据帧的字典。

感谢所有帮助!

data = list(dict_main.keys())
channels = dict_main[data[0]]

app.layout = html.Div(
    [
        html.Div([
            dcc.Dropdown(
                id='data-dropdown',
                options=[{'label': speed, 'value': speed} for speed in data],
                value=list(dict_main.keys())[0],
                searchable=False
            ),
        ], style={'width': '49%', 'display': 'inline-block'}),
        html.Div([
            dcc.Dropdown(
                id='channel-dropdown',
                multi=True
            ),
        ], style={'width': '49%', 'display': 'inline-block'}
        ),
        html.Div([
            dcc.Graph(
                id='Main-Graph',
            ),
        ], style={'width': '98%', 'display': 'inline-block'}
        )
    ]
)

@app.callback(
    Output('channel-dropdown', 'options'),
    [Input('data-dropdown', 'value')])
def update_date_dropdown(speed):
    return [{'label': i, 'value': i} for i in dict_main[speed]]

@app.callback(
    Output('Main-Graph', 'figure'),
    [Input('channel-dropdown', 'value')],
    [State('data-dropdown', 'value')])
def updateGraph(channels, speed):
    if channels:

        return go.Figure(data=[go.Scatter(x=dict_main[speed].index, y=dict_main[speed][i], name=i, yaxis='y2') for i in channels])
    else:
        return go.Figure(data=[])

if __name__ == '__main__':
    app.run_server()

更新!这行得通,尽管仍然需要对颜色和位置进行一些小的更改 - 感谢 @Philipp 的所有帮助;

@app.callback(
    Output('Main-Graph', 'figure'),
    [Input('channel-dropdown', 'value')],
    [State('rpm-dropdown', 'value')])
def updateGraph(channels, test):
    if channels:
        j=1
        my_layout = {}
        my_axis = list("")
        for index, column in enumerate(list(channels)):
            my_layout['yaxis' + str(j) if j > 1 else 'yaxis'] = {}
            my_layout['yaxis' + str(j) if j > 1 else 'yaxis']['title'] = column
            my_layout['yaxis' + str(j) if j > 1 else 'yaxis']['overlaying'] = 'y' if j > 1 else 'free'
            my_layout['yaxis' + str(j) if j > 1 else 'yaxis']['anchor'] = 'free'
            my_layout['yaxis' + str(j) if j > 1 else 'yaxis']['side'] = 'left'
            my_axis.append('y' + str(j) if j > 1 else 'y')
            j+=1
        return go.Figure(data=[go.Scatter(x=dict_main[test].index, y=dict_main[test][column], name=column, yaxis=my_axis[index]) for index, column in enumerate(channels)],layout=my_layout)

    else:
        return go.Figure(data=[])

【问题讨论】:

    标签: python pandas dataframe plotly plotly-dash


    【解决方案1】:

    您必须在图形的布局属性中定义每个 y 轴(现在您只设置数据属性)。请参阅此example

    如果您不想绘制所有 y 轴(如果您的 df 有很多列),则必须通过设置 [overlaying, ticks, showticklabels, showgrid, zeroline] 等变量将其中一些设置为不可见(您可以找到有关它们的信息here),但它们仍然必须在布局中相应地定义,以便您可以在 scatter 函数中引用它们。

    【讨论】:

    • 我有大量的列,它们会根据所选的 df 而变化。我想尝试动态添加额外的 yaxis。 IE; go.Figure([go.Scatter(x=dict_main[test].index, y=dict_main[test][i], name=i, yaxis=i) for i in channels]) 而不必手动定义它们。有什么想法吗?
    • go.Figure(data=[go.Scatter(x=dict_main[test].index, y=dict_main[test][i], name=i, yaxis=i) for i in channels ], layout=my_layout) 其中 my_layout 是您可以借助我链接的示例动态构建的东西。
    • 用一些“伪”代码帮助你更多:my_layout={} for index, column in enumerate(list(df.columns)): my_layout['yaxis'+i] = {} my_layout['yaxis'+i][''title"] = column。注意没有 yaxis0 也没有 yaxis1,它们是:yaxis, yaxis2, yaxis3。你必须做相应的。
    • 感谢您的支持!我试图实现这一点,并认为我有正确获取 yaxis 编号的逻辑。我只是想知道在哪里声明 my_layout?我已经更新了我原来的问题以表明我的意思。
    • my_layout 必须在循环之前使用 my_layout={} 在 updateGraph 函数中声明。请注意,您是对的,在您的散点图中,您必须使用 y、y2、y3 来引用 yaxis,而在布局中您将它们称为 yaxis、yaxis2、ayxis3。
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多