'失踪' matplotlib条形图中的条形图

时间:2018-03-14 04:43:33

标签: pandas matplotlib

我已经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)

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 应该能够显示它。< / p>

enter image description here

1 个答案:

答案 0 :(得分:3)

the previous question中的问题是,大熊猫条形图是一个分类图,它将条形放置在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