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

如何在保留pandas绘图共享X轴时去除多余日期刻度?

解决Pandas Plot共享X轴时的多余日期刻度问题

当使用Pandas的plot方法绘制DataFrame列,且DataFrame索引大部分是规则间隔日期、仅最后一个为额外日期时,开启sharex=True共享X轴后会出现大量多余的X轴刻度。以下是两种无需放弃Pandas Plot和共享轴的解决方案:

方案1:手动指定X轴刻度为DataFrame索引

直接把X轴刻度设置为DataFrame中存在的日期索引,彻底控制要显示的刻度内容:

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

x = np.arange(-3, 3, 0.1)
dates = pd.date_range(end=dt.date(2022, 9, 30), freq="Q", periods = len(x), name="date")

y1 = np.sin(x)
y2 = np.cos(x)

trig = pd.DataFrame({"sin": y1, "cos": y2}, index = dates)

extra_date = pd.date_range(end=dt.date(2022, 10, 19), freq="D", periods = 1, name="date")
extra = pd.DataFrame({"sin": np.sin(2.91), "cos": np.cos(2.91)}, index = extra_date)
trig = pd.concat([trig, extra])

fig, axes = plt.subplots(2, 1, figsize=(15, 7), sharex=True) 
trig.sin.plot(ax=axes[0], grid=True, style=["o-"], rot=0, title="Sin")
trig.cos.plot(ax=axes[1], grid=True, style=["o-"], rot=0, title="Cos")

# 关键:设置X轴刻度为DataFrame的所有索引日期
for ax in axes:
    ax.set_xticks(trig.index)
    ax.set_xticklabels(trig.index.strftime('%Y-%m-%d'), ha='center')

plt.tight_layout()
plt.show()

方案2:使用Pandas Plot的x_compat=True参数

Pandas的plot方法提供了x_compat=True参数,强制使用Matplotlib的日期刻度处理逻辑,避免因不规则日期间隔生成多余刻度:

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

x = np.arange(-3, 3, 0.1)
dates = pd.date_range(end=dt.date(2022, 9, 30), freq="Q", periods = len(x), name="date")

y1 = np.sin(x)
y2 = np.cos(x)

trig = pd.DataFrame({"sin": y1, "cos": y2}, index = dates)

extra_date = pd.date_range(end=dt.date(2022, 10, 19), freq="D", periods = 1, name="date")
extra = pd.DataFrame({"sin": np.sin(2.91), "cos": np.cos(2.91)}, index = extra_date)
trig = pd.concat([trig, extra])

fig, axes = plt.subplots(2, 1, figsize=(15, 7), sharex=True) 
# 添加x_compat=True参数
trig.sin.plot(ax=axes[0], grid=True, style=["o-"], rot=0, title="Sin", x_compat=True)
trig.cos.plot(ax=axes[1], grid=True, style=["o-"], rot=0, title="Cos", x_compat=True)

for ax in axes:
    for label in ax.xaxis.get_ticklabels():
        label.set_ha('center')

plt.tight_layout()
plt.show()

问题原因

开启sharex=True后,Matplotlib会根据数据的整体日期范围自动生成刻度。由于最后一个日期打破了原有的季度间隔,Matplotlib默认切换到日度刻度,导致出现大量多余刻度。上述两种方案分别通过手动控制刻度、强制兼容Matplotlib日期处理逻辑解决了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:40:27