如何在含双Y轴的Plotly图表X轴上下添加分类时间线
Plotly双Y轴图表添加分类时间线标签实现方法
可复现代码
import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 构造示例DataFrame dates = pd.date_range(start='2023-01-01', periods=30, freq='D') df = pd.DataFrame({ 'date': dates, 'A': [i*2 + 10 for i in range(30)], 'B': [i*1.5 + 5 for i in range(30)], 'C': [i*3 + 20 for i in range(30)], 'D': ['pre']*10 + ['during']*10 + ['post']*10 }) # 创建双Y轴子图布局 fig = make_subplots(specs=[[{"secondary_y": True}]]) # 添加A列折线(左Y轴) fig.add_trace( go.Scatter(x=df['date'], y=df['A'], name='A列折线', line=dict(color='#1f77b4')), secondary_y=False ) # 添加B列折线(右Y轴) fig.add_trace( go.Scatter(x=df['date'], y=df['B'], name='B列折线', line=dict(color='#2ca02c')), secondary_y=True ) # 添加C列柱状图(左Y轴) fig.add_trace( go.Bar(x=df['date'], y=df['C'], name='C列柱状', marker=dict(color='#ff7f0e', opacity=0.5)), secondary_y=False ) # 计算每个阶段的日期中点,用于放置标签 category_info = df.groupby('D')['date'].agg(['min', 'max']).reset_index() category_info['mid_date'] = category_info.apply(lambda row: row['min'] + (row['max'] - row['min'])/2, axis=1) # 配置辅助X轴(显示阶段标签,位于主X轴下方) fig.update_layout( # 主X轴配置 xaxis=dict( title='日期', position=0.15, # 上移主X轴,给辅助轴预留空间 tickformat='%Y-%m-%d' ), # 辅助X轴(阶段标签) xaxis2=dict( title='阶段', overlaying='x', side='bottom', position=0.05, tickmode='array', tickvals=category_info['mid_date'], ticktext=category_info['D'], showgrid=False, tickfont=dict(size=12, weight='bold', color='#d62728') ), # Y轴配置 yaxis=dict(title='A/C列数值'), yaxis2=dict(title='B列数值'), # 整体布局 title='带阶段时间线标签的双Y轴图表', barmode='overlay', height=600 ) # 可选:在图表上方添加阶段标签(替换辅助轴方式) # for _, row in category_info.iterrows(): # fig.add_annotation( # x=row['mid_date'], # y=max(df['A'].max(), df['B'].max(), df['C'].max()) * 1.1, # text=row['D'], # showarrow=False, # font=dict(size=14, weight='bold', color='#d62728') # ) fig.show()
关键实现逻辑
- 双Y轴布局:通过
make_subplots的secondary_y=True参数创建双Y轴,分别绑定折线图A/B和柱状图C - 阶段标签定位:按D列分组计算每个阶段的日期区间中点,确保标签居中对齐对应时间范围
- 辅助X轴方式:添加叠加的辅助X轴,设置刻度值为阶段中点、刻度文本为分类标签,通过
position参数调整位置避免与主X轴重叠 - 注释替代方案:如果不需要额外轴,可通过
add_annotation批量在图表顶部添加阶段标签
效果说明
- 主X轴显示具体日期,下方辅助轴清晰标注
pre/during/post三个阶段 - 双Y轴分别对应不同数据维度的数值范围,折线与柱状图叠加展示无冲突
- 阶段标签与对应时间区间精准对齐,提升图表的可读性和信息传递效率
内容的提问来源于stack exchange,提问作者Chronicles
相关产品推荐
相关产品推荐

