我有一个errorbar图,其中x轴是datetime对象的列表。标准绘图方法将把第一个点和最后一个点放在绘图的边界框上。我想把第一点和最后一点偏移半个刻度,以便能清楚地看到。
ax.axis(xmin=-0.5,xmax=len(dates)-0.5)
由于显而易见的原因,不起作用。如果能够在不硬编码任何日期的情况下做到这一点就好了。
下面将生成一个有10个点的图,但您实际上只能看到8个点。
import datetime
import matplotlib.pyplot as plt
dates = [datetime.date(2002, 3, 11) - datetime.timedelta(days=x) for x in range(0, 10)]
yvalues = [2, 4, 1,7,9,2, 4, 1,7,9]
errorvalues = [0.4, 0.1, 0.3,0.4, 0.1,.4, 0.1, 0.3,0.4, 0.1]
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.errorbar(dates,yvalues,yerr=errorvalues,fmt='.')
fig.autofmt_xdate()
plt.show()
一个丑陋的修复方法是:
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.errorbar(range(len(dates)),yvalues,yerr=errorvalues)
ax.set_xticks(range(len(dates))
ax.set_xticklabels(dates, fontsize=8)
ax.axis(xmin=-0.5,xmax=len(dates)-0.5)
fig.autofmt_xdate()
这样做的缺点是axis对象不是datetime类型,因此您不能使用许多函数。
您可以使用ax.margins
来获得您想要的。
如果没有看到你的数据,很难知道你真正想要多大的边距。如果使用python datetime-types进行绘图,则margin为1对应于相当大的margin:
fig, ax = plt.subplots()
ax.bar(x, y)
[t.set_ha('right') for t in ax.get_xticklabels()]
[t.set_rotation_mode('anchor') for t in ax.get_xticklabels()]
[t.set_rotation(45) for t in ax.get_xticklabels()]
ax.margins(x=1)
但是,在没有看到现有数据和图表的情况下,很难做到太具体。
您可以使用margin()设置空格
import datetime
import matplotlib.pyplot as plt
dates = [datetime.date(2002, 3, 11) - datetime.timedelta(days=x) for x in range(0, 10)]
yvalues = [2, 4, 1,7,9,2, 4, 1,7,9]
errorvalues = [0.4, 0.1, 0.3,0.4, 0.1,.4, 0.1, 0.3,0.4, 0.1]
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.errorbar(dates,yvalues,yerr=errorvalues,fmt='.')
ax.margins(x=0.05)
fig.autofmt_xdate()
plt.show()