如何用Python Plotly实现X轴年、月、周三层标签
实现Plotly三层X轴标签(年、月、周)
可以实现三层X轴标签,通过Plotly的多轴叠加功能就能完成。核心思路是用一个基础数值轴定位数据,再叠加两个上层轴分别对应月和年的标签,具体步骤和代码如下:
步骤说明
- 先对数据按年→月→周排序,保证层级顺序正确
- 创建一个基础数值列(比如用索引)作为X轴的定位基准,方便后续对齐各层级标签
- 通过分组获取每个月、每年的起始位置,作为上层轴的刻度位置
- 叠加三个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
相关产品推荐
相关产品推荐

