绘图破折号:为每个选定的 df 列添加新的 yaxis



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

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

首先,我尝试在定义 x、y 和名称后更改 updateGraph 回调以包含yaxis=i。查看文档,似乎我可以在go.Scatter中定义 yaxis,但我需要将它们设置为"y2"、"y3"、"y4"等。我也尝试以这种方式通过go.Figure.add_trace更新布局,但都没有奏效。代码如下,其中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=[])

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

如果你不想绘制所有的y轴(如果你的df有很多列(,你必须通过设置变量(如[叠加,刻度,显示刻度标签,显示网格,零线](来设置其中一些不可见(你可以在这里找到有关它们的信息(,但它们仍然必须在布局中相应地定义,以便你可以在散点函数中引用它们。

最新更新