You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 20:45:02