当使用具有不同x轴限制的子图时,使用set_major_locator()
遇到了一个奇怪的问题。一个最小的例子:
import matplotlib.pyplot as pl
import matplotlib.dates as mdates
from datetime import datetime
h24 = mdates.HourLocator(interval=24)
fmt = mdates.DateFormatter('%d-%m %H:%M')
start1 = datetime(year=2016, month=7, day=7, hour=0)
end1 = datetime(year=2016, month=7, day=9, hour=0)
start2 = datetime(year=2016, month=9, day=30, hour=0)
end2 = datetime(year=2016, month=10, day=2, hour=0)
start3 = datetime(year=2016, month=5, day=8, hour=0)
end3 = datetime(year=2016, month=5, day=10, hour=0)
pl.figure(figsize=(9,3))
ax=pl.subplot(131)
ax.set_xlim(start1, end1)
ax.xaxis.set_major_locator(h24)
ax.xaxis.set_major_formatter(fmt)
ax=pl.subplot(132)
ax.set_xlim(start2, end2)
ax.xaxis.set_major_locator(h24)
ax.xaxis.set_major_formatter(fmt)
ax=pl.subplot(133)
ax.set_xlim(start3, end3)
ax.xaxis.set_major_locator(h24)
ax.xaxis.set_major_formatter(fmt)
pl.tight_layout()
这将导致:
如果我将所有子图的x限制设置为相同(在这种情况下,对所有子图使用ax.set_xlim(start1, end1)
),则可以按预期工作:
此外,保留不同的set_xlim()
并删除set_major_locator()
和set_major_formatter()
行是可行的(尽管在这种情况下,我得到了不可读的x标签。):
我是在某个地方犯了一个愚蠢的错误,还是我的第一个示例中缺少的x标记和标签是Matplotlib中的错误?
p.s。 Matplotlib 3.0.2,Python 3.7.2
答案 0 :(得分:1)
从matplotlib的当前版本开始,您无法在多个轴上为日期重复使用相同的代码和格式化程序。因此,您需要每轴一个定位器和一个格式化程序。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
def fmt_xaxes(ax):
h24 = mdates.HourLocator(interval=24)
fmt = mdates.DateFormatter('%d-%m %H:%M')
ax.xaxis.set_major_locator(h24)
ax.xaxis.set_major_formatter(fmt)
start1 = datetime(year=2016, month=7, day=7, hour=0)
end1 = datetime(year=2016, month=7, day=9, hour=0)
start2 = datetime(year=2016, month=9, day=30, hour=0)
end2 = datetime(year=2016, month=10, day=2, hour=0)
start3 = datetime(year=2016, month=5, day=8, hour=0)
end3 = datetime(year=2016, month=5, day=10, hour=0)
fig, (ax1, ax2, ax3) = plt.subplots(ncols=3, figsize=(9,3))
ax1.set_xlim(start1, end1)
fmt_xaxes(ax1)
ax2.set_xlim(start2, end2)
fmt_xaxes(ax2)
ax3.set_xlim(start3, end3)
fmt_xaxes(ax3)
plt.tight_layout()
plt.show()