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

如何在含双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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:20:45