在制作熊猫数据框的条形图时,我一直在调试显示问题。
今天遇到一个奇怪的问题:
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应该能够显示它。
上一个问题中的问题是熊猫条形图是一个分类图,它将条形放置在位置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)
假设日期间隔相等,情节将如下所示:
归档时间: |
|
查看次数: |
5446 次 |
最近记录: |