需要在两个子图上显示自定义共享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不起作用,因为每个数据集的日期不同。
答案 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()
答案 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()