我已经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 应该能够显示它。< / p>
答案 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])
该情节将如下所示,假设日期间隔相等: