勾选标签仅显示在一个子图中

时间:2018-03-28 18:30:52

标签: 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')
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不起作用,因为每个数据集的日期不同。

2 个答案:

答案 0 :(得分:1)

这似乎对我有用,就在shared_axis_demo

之后
fig = plt.figure()

ax1 = plt.subplot(211)
_ = plt.plot(y1)
plt.setp(ax1.get_xticklabels(), visible=True)

ax2 = plt.subplot(212, sharex=ax1)
_ = plt.plot(y2)
plt.show()

enter image description here

答案 1 :(得分:1)

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

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

现在有两种选择。

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

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

    plt.setp(ax1.get_xticklabels(), visible=True)
    

    不幸的是,这个选项在最新的matplotlib版本上被破坏了。我只是opened a bug report关于它。

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

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()

enter image description here