【问题标题】:'missing' bars in matplotlib bar chartmatplotlib 条形图中的“缺失”条形图
【发布时间】:2018-08-22 12:30:36
【问题描述】:

我一直是debugging display issues when making bar charts of pandas dataframes

今天遇到一个奇怪的问题:

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

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

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

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

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

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

errors.plot(kind="bar")

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

【问题讨论】:

标签: pandas matplotlib


【解决方案1】:

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

当然,这不仅会影响条形的位置,还会影响它们的宽度。条形宽度为0.8,以轴为单位。
在分类图中,宽度为0.8(我认为这是默认值)的条几乎与分类区间1 一样宽。在数字图中,0.8 的宽度与数据范围相比可以任意大或小。 IE。如果您将条形图彼此相距几秒钟但宽度为 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])

假设日期等距,情节将如下所示:

【讨论】: