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

使用pandas/matplotlib绘制柱状图时x轴日期标签重叠如何解决

时间索引柱状图x轴标签重叠通用解决方案

问题描述

使用pandas/matplotlib绘制时间索引的柱状图时,当数据点较多会出现x轴日期标签重叠的问题,需要适配日度、周度、月度、年度等不同时间频率的通用解决方案。
测试复现代码:

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

idx = pd.date_range("2015-01-01", "2021-09-30", freq="b")
data = np.random.randn(len(idx))

df = pd.DataFrame(data={"returns": data}, index=idx)

df.plot(kind="bar")

plt.show()

问题效果图:
x轴日期标签重叠的柱状图

通用解决方案

以下方案适配所有时间频率的数据集,可根据需求选择:

方案1:快速自适应调整(最简单,适合绝大多数场景)

只需要在plt.show()前添加2行代码,自动旋转标签并调整布局避免重叠:

# 旋转x轴标签45度并右对齐,避免文字重叠
plt.xticks(rotation=45, ha='right')
# 自动调整画布布局,防止标签被画布边缘截断
plt.tight_layout()

方案2:自定义刻度显示规则(完全可控,适配所有时间频率)

如果数据量极大,方案1仍无法满足需求,可以手动控制x轴标签的显示间隔,既可以按固定样本间隔显示,也可以按年/季/月等时间单位显示:

按固定样本间隔显示示例

ax = df.plot(kind="bar")
# 自定义每N个样本显示1个标签,N可根据总数据量灵活调整
show_every_n = 60
ax.set_xticks(range(0, len(df.index), show_every_n))
# 对应设置格式化后的日期标签
ax.set_xticklabels(df.index.strftime('%Y-%m-%d')[::show_every_n], rotation=45, ha='right')

plt.tight_layout()
plt.show()

按时间单位显示示例(以年度为例,可改为季度/月度等)

不管原始数据是日度、周度还是月度,都可以按指定时间单位显示标签:

ax = df.plot(kind="bar")
# 提取每年第一个数据点的位置
year_start_pos = df.index.year.to_series().drop_duplicates(keep='first').index
ax.set_xticks([df.index.get_loc(dt) for dt in year_start_pos])
# 设置标签仅显示年份,不需要旋转
ax.set_xticklabels([dt.strftime('%Y') for dt in year_start_pos], rotation=0)

plt.tight_layout()
plt.show()

注意事项

pandas的plot(kind='bar')默认将每个样本作为独立分类刻度,不会自动识别时间间隔,因此不要直接使用matplotlib的mdates日期定位器,会出现坐标不匹配的问题,上述手动设置刻度的方式兼容性最高。
如果数据量超过1000个,柱状图本身会过于密集,建议先聚合为更高时间频率(如周/月/季)的数据后再绘制,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:04