Python 3.x 勾选标签仅显示在一个子批次中

Python 3.x 勾选标签仅显示在一个子批次中,python-3.x,pandas,matplotlib,Python 3.x,Pandas,Matplotlib,需要使用两个日期不同的数据集在两个子地块上显示自定义共享x轴刻度标签 from pandas import DataFrame, date_range, Timedelta import numpy as np from matplotlib import pyplot as plt import matplotlib.dates as mdates #Dataset 1 rng1 = date_range(start='01-01-2015', periods=5, freq='1M') d

需要使用两个日期不同的数据集在两个子地块上显示自定义共享x轴刻度标签

from pandas import DataFrame, date_range, Timedelta
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.dates as mdates

#Dataset 1
rng1 = date_range(start='01-01-2015', periods=5, freq='1M')
df1 = DataFrame({'y':np.random.normal(size=len(rng1))}, index=rng1)
y1 = df1['y']

#Dataset 2
rng2 = date_range(start='01-01-2015', periods=5, freq='2M')
df2 = DataFrame({'y':np.random.normal(size=len(rng2))}, index=rng2)
y2 = df2['y']

#Figure
fig,(ax1,ax2) = plt.subplots(2,1,sharex=True)

y1.plot(ax=ax1)
y2.plot(ax=ax2)
plt.xticks(rotation=30)
ax1.xaxis.set_minor_formatter(plt.NullFormatter())

ax2.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%D'))

plt.show()
(上图)在上部子地块上创建不带x轴标签的地物

我希望添加下面的代码,将相同的x轴标签显示到上面的子图中,但它们没有显示出来。我做错了什么

ax1.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%D'))

设置sharex=False不起作用,因为每个数据集的日期都不同。

这似乎对我起作用,只是在


首先,如果要在通过pandas创建的绘图上使用
matplotlib.dates
定位器和格式化程序,应在绘图中使用
x_compat=True
参数,否则pandas可能会任意缩放轴

然后,
“%D”
不是有效的格式字符串。也许你的意思是
“%b”

现在有两种选择

  • 使用
    sharex=False
    ,将定位器和格式化程序设置为两个轴,最后将一个绘图的限制设置为另一个绘图的限制。在这种情况下,由于较低的图包含较大的范围

    ax1.set_xlim(ax2.get_xlim())
    
  • 另一个选项是使用
    sharex=True
    并再次显示标签

    plt.setp(ax1.get_xticklabels(), visible=True)
    
    不幸的是,此选项在最新的matplotlib版本上被破坏。我只是说说而已

第一个选项的完整代码(因为第二个选项不工作):


是的,您可以在
plt.show()的正上方插入
ax2.xaxis.set\u major\u格式化程序(mdates.DateFormatter(“%D”)
以正确格式化。奇怪的是,我无法使两个轴都旋转。我可以让顶部轴只旋转,或者如果我尝试旋转底部,它们都会消失。希望只是使字体适当,并且记号足够稀疏,这样就不必旋转它们了。我添加了
plt.xticks(rotation=30)
,它会在ax2上旋转标签。然后在
plt.setp()
中添加
rotation=30
,以旋转ax1标签。
plt.setp(ax1.get_xticklabels(), visible=True)
from pandas import DataFrame, date_range, Timedelta
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.dates as mdates

#Dataset 1
rng1 = date_range(start='2015-01-01', periods=5, freq='1M')
df1 = DataFrame({'y':np.random.normal(size=len(rng1))}, index=rng1)
y1 = df1['y']

#Dataset 2
rng2 = date_range(start='2015-01-01', periods=5, freq='2M')
df2 = DataFrame({'y':np.random.normal(size=len(rng2))}, index=rng2)
y2 = df2['y']

#Figure
fig,(ax1,ax2) = plt.subplots(2,1,sharex=False)

y1.plot(ax=ax1, x_compat=True)
y2.plot(ax=ax2, x_compat=True)

plt.xticks(rotation=30)

ax1.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax1.xaxis.set_minor_locator(plt.NullLocator())
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%b'))

ax2.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax2.xaxis.set_minor_locator(plt.NullLocator())
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%b'))

ax1.set_xlim(ax2.get_xlim())

plt.show()