如何使用Plotly Dash制作双下拉菜单分别控制子图并解决运行异常
问题排查与修复说明
现有代码错误点
- 实例名不统一:初始化的Dash实例名为
ash,后续设置布局、绑定回调时错误使用dash调用,属于基础变量名错误,会直接触发变量未定义报错 - html组件传参错误:
html.P的第二个参数为样式属性位,你直接将第二个下拉菜单的配置放在该位置,导致第二个下拉菜单不会被渲染 - 未定义变量引用:第二个下拉菜单的默认值设置为
labels[0],但代码中从未定义labels变量,应该替换为indexs[0] - 布局样式错误:
display属性值写错,inline block需要改为标准写法inline-block,否则布局排版会失效 - 回调逻辑冗余:相同的子图创建、K线添加逻辑重复编写,后续维护难度高
修正后可运行代码
from jupyter_dash import JupyterDash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import plotly.graph_objects as go from plotly.subplots import make_subplots import pandas as pd # 此处为示例模拟数据,可替换为自己的真实数据源 stock1 = pd.DataFrame({'date':pd.date_range('2023-01-01',periods=100), 'price':range(100)}) stock2 = pd.DataFrame({'date':pd.date_range('2023-01-01',periods=100), 'price':range(50,150)}) index1 = pd.DataFrame({'date':pd.date_range('2023-01-01',periods=100), 'open':range(100), 'high':range(105,205), 'low':range(95,195), 'close':range(102,202)}) index2 = pd.DataFrame({'date':pd.date_range('2023-01-01',periods=100), 'open':range(200,300), 'high':range(205,305), 'low':range(195,295), 'close':range(202,302)}) ash = JupyterDash(__name__) stocks = ['stock1','stock2'] indexs = ['index1', 'index2'] stock_map = {'stock1':stock1, 'stock2':stock2} index_map = {'index1':index1, 'index2':index2} fig = go.Figure() ash.layout = html.Div([ dcc.Graph(id = 'plot', figure = fig), html.Div([ html.Div([ html.Label("个股选择"), dcc.Dropdown(id='stock', options=[{'label': i, 'value': i} for i in stocks], value=stocks[0]) ], style={'width':'48%', 'display':'inline-block'}), html.Div([ html.Label("指数选择"), dcc.Dropdown(id='index', options=[{'label': i, 'value': i} for i in indexs], value=indexs[0]) ], style={'width':'48%', 'display':'inline-block', 'margin-left':'4%'}) ], style={'width': '80%', 'padding-left':'10%', 'padding-right': '10%', 'margin-top':'20px'}) ]) @ash.callback(Output('plot', 'figure'), [Input('stock', 'value'), Input('index', 'value')]) def update_figure(selected_stock, selected_index): fig1 = make_subplots(rows=2, cols=1, subplot_titles=('个股价格走势', '指数行情')) # 加载个股走势 stock_data = stock_map[selected_stock] fig1.add_trace(go.Scatter(x = stock_data['date'], y = stock_data['price'], name=selected_stock), row=1, col=1) # 加载指数K线 index_data = index_map[selected_index] fig1.add_trace(go.Candlestick(x=index_data['date'], open=index_data['open'], high=index_data['high'], low=index_data['low'], close=index_data['close'], name=selected_index), row=2, col=1) fig1.update_layout(xaxis2_rangeslider_visible=False, height=700) return fig1 ash.run_server(mode='inline')
内容的提问来源于stack exchange,提问作者illhahb
相关产品推荐
相关产品推荐

