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

Matplotlib多折线图x轴刻度优化:仅显示每组起止年份

解决X轴刻度重叠问题:仅显示每个Group的起始和结束年份

问题根源

原代码为每个数据行都添加了年份标签,导致15个刻度标签挤在一起产生重叠。我们需要只在每个Group的首尾位置显示对应年份,中间位置留空标签。

修正方案

通过动态识别每个Group的起始和结束索引,生成仅包含首尾年份的标签列表,替换原有的全量标签:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 确保date列是datetime类型
df['date'] = pd.to_datetime(df['date'])

# 获取每个Group的起始和结束索引
group_bounds = df.groupby('group').agg(
    start_idx=('date', lambda x: x.index[0]),
    end_idx=('date', lambda x: x.index[-1])
)
start_end_pairs = list(zip(group_bounds['start_idx'], group_bounds['end_idx']))

# 生成X轴刻度和标签
total_rows = len(df)
xticks = np.arange(total_rows)
xtick_labels = [''] * total_rows

for start, end in start_end_pairs:
    # 提取首尾年份并设置标签
    xtick_labels[start] = str(df.loc[start, 'date'].year)
    xtick_labels[end] = str(df.loc[end, 'date'].year)

# 绘图部分
fig, ax = plt.subplots(figsize=(10,6))
df.set_index(['group'], append=True).unstack()['share'].plot(ax=ax)

# 设置刻度和标签
ax.set_xticks(xticks)
ax.set_xticklabels(xtick_labels, rotation=45)

plt.legend(loc='upper left')
ax.grid(which='major', alpha=0.5)
ax.grid(which='minor', alpha=0.2)
plt.ylim(0, 0.22)
plt.tight_layout()  # 防止旋转后的标签被截断
plt.show()

关键改进点

  1. 动态识别Group边界:通过groupby自动获取每个Group的首尾索引,适配不同行数的Group
  2. 精简标签:仅在Group的起始和结束位置显示年份,其余位置留空
  3. 优化布局:添加plt.tight_layout()避免旋转后的标签被画布边缘截断

内容的提问来源于stack exchange,提问作者Olive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:01:58