matplotlib 条形图中的“缺失”条

use*_*757 3 matplotlib 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
Run Code Online (Sandbox Code Playgroud)

当我将数据绘制为时间序列时,它看起来不错:

plt.plot(errors.index, errors.values)

在此处输入图片说明

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

plt.bar(errors.index, errors.values)
plt.gcf().autofmt_xdate()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我认为条形图的数据条太多,无法很好地显示,但如果我直接从数据框中绘制条,则情况并非如此:

errors.plot(kind="bar")

但是,dataframe.plot 不能很好地处理这么多带有轴标签的条形……但它告诉我 plt.bar应该能够显示它。

在此处输入图片说明

Imp*_*est 7

上一个问题中的问题是熊猫条形图是一个分类图,它将条形放置在位置0, 1, ... N-1。然后单独标记每个条形。相比之下,matplotlib 条形图是数字图,它根据条形所属的日期将条形放置在数字位置。

当然,这不仅会影响条形的位置,还会影响它们的宽度。条形宽度是以0.8轴为单位的。
在分类图中,一条宽度0.8(我认为这是默认值)几乎与分类区间一样宽1。在数字图中,0.8与数据范围相比,的宽度可以任意大或小。即,如果您绘制的条形图彼此相距几秒钟,但宽度为 1 天,则它们将重叠,或者 - 就像这里的情况 - 如果您绘制的条形图彼此相距数年,则 1 天宽度的条形将消失。这是因为如果条宽小于屏幕上的一个像素,您需要幸运地看到它。

因此,您可以手动指定宽度。在这种情况下,似乎可以使条形宽度为 20 天,

plt.bar(df.index, df.error.values, width=20)
Run Code Online (Sandbox Code Playgroud)

或者您可以首先计算一个合理的宽度,例如通过查看连续索引之间的差异,

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

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

在此处输入图片说明