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

如何用Python Plotly实现X轴年、月、周三层标签

实现Plotly三层X轴标签(年、月、周)

可以实现三层X轴标签,通过Plotly的多轴叠加功能就能完成。核心思路是用一个基础数值轴定位数据,再叠加两个上层轴分别对应月和年的标签,具体步骤和代码如下:

步骤说明

  1. 先对数据按年→月→周排序,保证层级顺序正确
  2. 创建一个基础数值列(比如用索引)作为X轴的定位基准,方便后续对齐各层级标签
  3. 通过分组获取每个月、每年的起始位置,作为上层轴的刻度位置
  4. 叠加三个X轴,分别对应周(最下层)、月(中层)、年(上层),调整位置和样式让层级清晰

完整代码示例

import plotly.graph_objects as go
import pandas as pd

# 模拟你的数据集(替换成实际数据即可)
data = {
    'year': [2023,2023,2023,2023,2024,2024,2024],
    'month': [12,12,1,1,1,2,2],
    'week': [49,50,1,2,3,1,2],
    'value': [10,15,20,25,30,35,40]
}
df = pd.DataFrame(data)

# 按年、月、周排序,确保层级连续
df = df.sort_values(['year', 'month', 'week']).reset_index(drop=True)
# 创建基础X轴定位列(用索引作为位置标记)
df['x_pos'] = df.index

# 创建图表
fig = go.Figure()

# 添加数据轨迹
fig.add_trace(go.Scatter(
    x=df['x_pos'],
    y=df['value'],
    mode='lines+markers',
    name='数值'
))

# 获取年、月的刻度位置和标签
# 每年第一个数据的位置和年份标签
year_ticks = df.groupby('year')['x_pos'].first().tolist()
year_labels = df.groupby('year')['year'].first().tolist()
# 每个月第一个数据的位置和月份标签
month_ticks = df.groupby(['year', 'month'])['x_pos'].first().tolist()
month_labels = df.groupby(['year', 'month'])['month'].first().tolist()

# 配置三层X轴
fig.update_layout(
    # 最下层:周标签
    xaxis=dict(
        tickmode='array',
        tickvals=df['x_pos'],
        ticktext=df['week'],
        title='周',
        position=0,
        tickfont=dict(size=10),
        linecolor='black'
    ),
    # 中层:月标签
    xaxis2=dict(
        tickmode='array',
        tickvals=month_ticks,
        ticktext=[f'月{label}' for label in month_labels],
        title='月',
        overlaying='x',
        position=0.08,
        tickfont=dict(size=11),
        linecolor='black',
        showgrid=False
    ),
    # 上层:年标签
    xaxis3=dict(
        tickmode='array',
        tickvals=year_ticks,
        ticktext=[f'{label}年' for label in year_labels],
        title='年',
        overlaying='x',
        position=0.16,
        tickfont=dict(size=12),
        linecolor='black',
        showgrid=False
    ),
    yaxis=dict(title='数值'),
    height=500,
    margin=dict(t=80, b=80)
)

fig.show()

关键细节

  • overlaying='x':让多个X轴重叠显示
  • position:调整各轴的垂直位置,数值越大越靠上
  • 关闭上层轴的网格线(showgrid=False),避免和下层网格冲突
  • 分组获取起始位置:保证年、月标签正好对应其包含的周数据的起始点

内容的提问来源于stack exchange,提问作者Ayush Ranjan Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:23:10