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()
关键改进点
- 动态识别Group边界:通过
groupby自动获取每个Group的首尾索引,适配不同行数的Group - 精简标签:仅在Group的起始和结束位置显示年份,其余位置留空
- 优化布局:添加
plt.tight_layout()避免旋转后的标签被画布边缘截断
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

