matplotlib柱状图中的“missing”条

4
我一直在调试使用pandas数据框制作条形图时的显示问题
今天遇到了一个奇怪的问题:
index: <class 'pandas.tseries.index.DatetimeIndex'>
count   83.000
mean     0.000
std      0.879
min     -2.159
25%     -0.605
50%      0.001
75%      0.658
max      2.254
Name: error, dtype: float64

当我将数据绘制成时间序列时,它看起来很好: < p >< code > plt.plot(errors.index, errors.values)< /code >< /p >

enter image description here

但如果我将其打印成条形图,大多数条形图都不会出现:

plt.bar(errors.index, errors.values)
plt.gcf().autofmt_xdate()

enter image description here

我认为数据条数太多,无法很好地显示条形图,但如果我直接从数据框绘制条形图,则不是这样:

errors.plot(kind="bar")

但是,dataframe.plot在处理带有轴标签的许多条形图时表现不佳...但它告诉我plt.bar应该能够显示这个。

enter image description here

1个回答

11

前一个问题中的问题是,pandas条形图是一种分类图,它将条形放置在位置0, 1, ... N-1上。然后分别标记每个条形。相比之下,matplotlib条形图是一种数值图,它根据它们所属的日期在数值位置上放置条形。

当然,这不仅影响了条的位置,还影响了它们的宽度。柱形宽度为0.8是以轴为单位的。
在分类图中,宽度为0.8(我认为这是默认值)的条形几乎与分类间隔1一样宽。在数值图中,宽度为0.8的条形可以与数据范围任意大或任意小地相比。也就是说,如果你绘制间隔数秒但宽度为1天的条形,它们会重叠,或者 - 正如本例所示 - 如果你将条形的年份设置较远,则1天宽度的条形将消失。这是因为,如果条形宽度在屏幕上小于一个像素,你需要很幸运才能看到它。

因此,你可以手动指定宽度。在本例中,将条形宽度设置为20天可能可行,

plt.bar(df.index, df.error.values, width=20)

或者你可以先计算一个合理的宽度,例如观察相邻索引之间的差异。

widths = [d.days for d in np.diff(df.index.tolist())]
plt.bar(df.index, df.error.values, width=.8*widths[0])

假设日期间隔相等,则情节将如下所示:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接