Plotly 通过 go.Candlestick 可绘制标准 K 线,但需严格满足 OHLC 数据格式(x 为 datetime,open/high/low/close 为数值)、时间对齐、缺失值处理;叠加成交量需共享 X 轴并配置 yaxis2;交互功能需手动设置 hovertemplate、scrollZoom 和 fixedrange 等参数。

Plotly 本身不内置金融 K 线图组件,但通过 plotly.graph_objects.Candlestick 可以可靠绘制标准 K 线;真正卡住人的不是画图,而是时间序列对齐、缺失值处理和 OHLC 数据格式校验。
确保输入数据严格符合 OHLC 格式
Plotly 的 Candlestick 要求输入必须是四列:时间(x)、开盘价(open)、最高价(high)、最低价(low)、收盘价(close)。常见错误是列名不匹配或类型错误:
-
open、high、low、close必须为数值型,不能是字符串或含空格的文本(如"12.34 ") -
x列需为datetime类型(pd.to_datetime()强制转换,别依赖自动推断) - 若使用
df.resample('D').agg({'open': 'first', 'high': 'max', ...}),注意first()和last()在非交易日可能返回 NaN,得提前用dropna()或ffill()处理
用 go.Candlestick 构建基础 K 线图
别用 px.line 或 px.scatter 替代——它们画不出实体/影线。直接构造 go.Candlestick 对象,并传入正确键名:
fig = go.Figure(data=[go.Candlestick(
x=df['date'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close']
)])
注意:open/close 决定实体颜色(默认涨绿跌红),但 Plotly 不自动识别涨跌逻辑——它只按数值大小判断:若 close > open 就画绿色,否则红色。所以数据顺序错(比如把开盘当收盘)会导致颜色反转。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
立即学习“Python免费学习笔记(深入)”;
添加成交量柱状图并共享 X 轴
金融看板通常叠加成交量,但 go.Bar 和 go.Candlestick 默认不共享坐标轴。必须显式设置 secondary_y=False 并用 fig.add_trace() + fig.update_layout(xaxis=dict(rangeslider=dict(visible=False))) 关掉自带时间滑块(否则会冲突):
- 成交量数据需与 K 线时间索引完全对齐(长度一致、顺序一致),建议用
df.set_index('date')后合并 - 用
yaxis2显示成交量,避免价格轴被压缩:fig.add_trace(go.Bar(x=df['date'], y=df['volume'], yaxis='y2')) - 调用
fig.update_layout(yaxis2=dict(side='right', overlaying='y', showgrid=False))才能正确右置
交互功能不是开箱即用,得手动配 config 和 layout
默认导出 HTML 后缩放、拖拽、悬停都可用,但几个关键交互常被忽略:
- 悬停信息默认只显示 OHLC 值,要加成交量需自定义
hovertemplate:hovertemplate='%{x}<br>O:%{open}<br>H:%{high}<br>L:%{low}<br>C:%{close}<br>V:%{customdata[0]}<extra></extra>',再用customdata=df[['volume']].values绑定 - 移动端双指缩放失效?在
fig.show(config={'scrollZoom': True, 'editable': False})中启用scrollZoom - 想禁用某类交互(比如不想让用户拖动时间轴)?设
xaxis=dict(fixedrange=True)
最易被跳过的点:K 线图的时间轴若含毫秒级时间戳,在浏览器中可能触发渲染抖动;建议统一转为 datetime64[D] 或 datetime64[ms],避免 pandas 自动升到纳秒精度。

















