Plotly实现叠加价值区条形图的蜡烛图子图坐标轴配置
问题原因
效果不对核心是3个配置错误:
- 水平价值区域条形图和K线共用了同一个X轴,条形默认从子图左侧X=0位置向右延伸,挤占K线显示空间,和示例「条形从子图右边缘向左延伸」的逻辑完全相反
- 给col=2位置的K线额外加了
yaxis="y2"参数,和shared_yaxes=True的共享Y轴逻辑冲突,会导致Y轴刻度错位 - 没有为水平条形图单独配置叠加的反向X轴,无法实现条形右对齐、不干扰K线布局的效果
修改方案
按以下点调整即可匹配示例效果:
- 删除初始化阶段错误的
overlaying配置,保留共享Y轴、0水平间距的基础设置 - 给每个子图的水平条形图单独绑定一个叠加X轴,配置为锚定对应子图Y轴、叠加在原X轴上、坐标轴反转,同时隐藏这个X轴的刻度、标签、网格线
- 删除第二个K线trace里多余的
yaxis="y2"参数 - 给条形图X轴设置合理范围,让最长的条形不会覆盖左侧K线区域
- 隐藏K线自带的滑动条等冗余元素
修正后完整代码
from plotly.subplots import make_subplots import plotly.graph_objects as go # 初始化1行2列子图,共享Y轴,子图间距为0 fig = make_subplots(rows=1, cols=2, shared_yaxes=True, horizontal_spacing=0) # -------------------------- 第一个子图(col=1,data_2) -------------------------- dateStr_2 = chart_data_2.index.strftime("%d-%m-%Y %H:%M:%S") # K线图 fig.add_trace( go.Candlestick( x=dateStr_2, open=chart_data_2['open'], high=chart_data_2['high'], low=chart_data_2['low'], close=chart_data_2['close'], name='K线' ), row=1, col=1 ) # 价值区域水平条形图,绑定独立叠加X轴 fig.add_trace( go.Bar( x=volume_profile_2.values, y=volume_profile_2.index, orientation='h', marker_color='rgba(0,0,255,0.25)', xaxis='x3', showlegend=False ), row=1, col=1 ) # 参考线 fig.add_hline(y=poc_price_2, annotation_text="POC", annotation_position="bottom right", line_width=1, line_color="red", row=1, col=1) fig.add_hline(y=VAH_2+0.5, annotation_text="VAH", annotation_position="top right", line_width=2, line_dash="dash", line_color="goldenrod", row=1, col=1) fig.add_hline(y=VAL_2-0.5, annotation_text="VAL", annotation_position="bottom right", line_width=2, line_dash="dash", line_color="goldenrod", row=1, col=1) # -------------------------- 第二个子图(col=2,data_1) -------------------------- dateStr_1 = chart_data_1.index.strftime("%d-%m-%Y %H:%M:%S") # K线图,删除多余的yaxis参数 fig.add_trace( go.Candlestick( x=dateStr_1, open=chart_data_1['open'], high=chart_data_1['high'], low=chart_data_1['low'], close=chart_data_1['close'], name='K线' ), row=1, col=2 ) # 价值区域水平条形图,绑定独立叠加X轴 fig.add_trace( go.Bar( x=volume_profile_1.values, y=volume_profile_1.index, orientation='h', marker_color='rgba(0,0,255,0.25)', xaxis='x4', showlegend=False ), row=1, col=2 ) # 参考线 fig.add_hline(y=poc_price_1, annotation_text="POC", annotation_position="bottom right", line_width=1, line_color="red", row=1, col=2) fig.add_hline(y=VAH_1+0.5, annotation_text="VAH", annotation_position="top right", line_width=2, line_dash="dash", line_color="goldenrod", row=1, col=2) fig.add_hline(y=VAL_1-0.5, annotation_text="VAL", annotation_position="bottom right", line_width=2, line_dash="dash", line_color="goldenrod", row=1, col=2) # -------------------------- 全局布局配置 -------------------------- fig.update_layout( height=600, title_text="叠加价值区域的K线对比图", # 第一个子图K线X轴 xaxis=dict( rangeslider=dict(visible=False), side='bottom' ), # 第二个子图K线X轴 xaxis2=dict( rangeslider=dict(visible=False), side='bottom' ), # 第一个子图条形图专用X轴:反转实现右对齐 xaxis3=dict( anchor='y', overlaying='x', autorange='reversed', showgrid=False, zeroline=False, showticklabels=False, range=[max(volume_profile_2.values)*1.1, 0] ), # 第二个子图条形图专用X轴:反转实现右对齐 xaxis4=dict( anchor='y2', overlaying='x2', autorange='reversed', showgrid=False, zeroline=False, showticklabels=False, range=[max(volume_profile_1.values)*1.1, 0] ) ) fig.show()
可调参数说明
- 条形宽度:修改
xaxis3/xaxis4里range的第一个系数,比如改成max(volume_profile_2.values)*1.5条形会变窄,改成*0.8条形会变长 - 条形透明度:直接修改
marker_color中rgba的第四个值,范围0-1,数值越小透明度越高 - 图例显示:如果不需要图例,在
update_layout里加showlegend=False即可
内容的提问来源于stack exchange,提问作者Pratik Ghodke
相关产品推荐
相关产品推荐

