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

DASH实时蜡烛图添加指标后定时更新时K线消失问题求助

DASH实时蜡烛图更新后消失问题

问题描述

我正在开发一款DASH实时蜡烛图(K线图)应用,遇到问题如下:

  • 项目运行初始加载时,蜡烛图和指标都能正常显示
  • dcc.Interval组件触发定时更新后,蜡烛图就会消失,即使从图例选项卡重新勾选显示蜡烛图,每次更新后仍会再次消失
  • 仅展示蜡烛图不添加指标时,更新完全正常,只有添加指标后才会出现首次更新后蜡烛图不可见的问题

数据来自WebSocket流,先存入SQL数据库,再读取转换为pandas DataFrame使用。

问题截图

问题截图1
问题截图2

相关实现代码

import dash
from dash.dependencies import Output, Input
from dash import dcc
from dash import html
import pandas as pd
import plotly.graph_objs as go
import flask
import waitress
from waitress import serve
from plotly.subplots import make_subplots

# 注:原代码缺失数据库engine初始化、make_subplots导入逻辑
server = flask.Flask(__name__) # define flask app.server

app = dash.Dash(__name__, server=server) # call flask server
    

app.layout = html.Div(
    html.Div([
        dcc.Graph(id='live-update-graph-scatter', animate=True),
        dcc.Interval(
            id='interval-component',
            disabled=False,
            interval=1*5000,
            n_intervals=0
        )
    ])
)

@app.callback(Output('live-update-graph-scatter', 'figure'),
              [Input('interval-component', 'n_intervals')])
def update_graph_scatter(n):


    rec = pd.read_sql_table('crypto', engine)
    rec1 = pd.DataFrame(rec)
    print(rec1)
    rec1.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'EMA', 'EMA2']

    rec1['date'] = pd.to_datetime(rec1['date'])
    rec1.set_index('date', inplace=True)

    ###SUBPLOT AND Candlestick CHART
    fig = make_subplots(rows=4, cols=1)

    fig.add_trace(go.Candlestick(
        x=rec1.index,
        open=rec1['open'],
        high=rec1['high'],
        low=rec1['low'],
        close=rec1['close']),
        row=1,
        col=1,
    )

    ###### ADD INDICATOR TRACES:
    fig.add_trace(
        go.Scatter(
            x=rec1.index,
            y=rec1['EMA'],
            marker=dict(color='blue')
        ),
        row=1,
        col=1
    )
    fig.add_trace(
        go.Scatter(
            x=rec1.index,
            y=rec1['EMA2'],
            marker=dict(color='red')
        ),
        row=1,
        col=1
    )



    return fig



if __name__ == '__main__':
    serve(app.server, host="localhost", port=5005)

解决方案

这个问题的核心是两个配置冲突导致的渲染异常,按以下步骤修改即可解决:

  1. 关闭Graph组件的animate属性
    实时更新蜡烛图场景下,Plotly的动画过渡逻辑会导致多trace叠加时渲染错位,把dcc.Graph的animate=True改为animate=False,蜡烛图场景不需要这类过渡动画。
  2. 关闭蜡烛图默认的X轴范围滑块,显式指定trace名称
    蜡烛图默认携带的底部范围滑块和子图布局存在冲突,会导致更新时显示异常,同时给每个trace指定固定名称,避免更新时图例索引错位导致的可见性异常。

修正后的核心代码示例

Layout部分修改:

dcc.Graph(id='live-update-graph-scatter', animate=False)

回调函数修改:

@app.callback(Output('live-update-graph-scatter', 'figure'),
              [Input('interval-component', 'n_intervals')])
def update_graph_scatter(n):
    rec = pd.read_sql_table('crypto', engine)
    rec1 = pd.DataFrame(rec)
    rec1.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'EMA', 'EMA2']
    rec1['date'] = pd.to_datetime(rec1['date'])
    rec1.set_index('date', inplace=True)

    fig = make_subplots(rows=4, cols=1)
    # 给蜡烛图指定固定名称和样式
    fig.add_trace(go.Candlestick(
        x=rec1.index,
        open=rec1['open'],
        high=rec1['high'],
        low=rec1['low'],
        close=rec1['close'],
        name='K线',
        increasing_line_color= '#26a69a',
        decreasing_line_color= '#ef5350'
    ), row=1, col=1)

    fig.add_trace(
        go.Scatter(
            x=rec1.index,
            y=rec1['EMA'],
            marker=dict(color='blue'),
            name='EMA1'
        ), row=1, col=1
    )
    fig.add_trace(
        go.Scatter(
            x=rec1.index,
            y=rec1['EMA2'],
            marker=dict(color='red'),
            name='EMA2'
        ), row=1, col=1
    )
    # 关键配置:关闭蜡烛图默认的范围滑块,避免和子图布局冲突
    fig.update_layout(xaxis_rangeslider_visible=False)
    return fig

修改完成后重新运行即可解决定时更新后蜡烛图消失的问题。


内容的提问来源于stack exchange,提问作者Mathias Albrechtsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:36:01