如何在保留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
相关产品推荐
相关产品推荐

