首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Plotly-Dash:根据选定的df列添加新的yaxis

Plotly-Dash:根据选定的df列添加新的yaxis
EN

Stack Overflow用户
提问于 2019-11-22 17:06:10
回答 1查看 804关注 0票数 5

我有一个基本的dash应用程序,从数据帧字典中绘制一些数据。第一个下拉菜单选择df,第二个下拉菜单选择要绘制的df列。

这工作得很好,但是我似乎不能为每个绘制的列添加一个新的yaxis。我在每个df中都有大量的列,它们根据所选的df而变化。

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

感谢所有的帮助!

代码语言:javascript
复制
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提供的所有帮助;

代码语言:javascript
复制
@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=[])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-22 20:39:47

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58990811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档