我以为肯定可以找到答案,但是我找不到它。尝试使用matplotlib制作条形图时遇到了一个问题。在大多数情况下,该图可以正确显示。但是,当我在绘制数据之前从数据中取出一些值时,这些条变得比我想要的宽得多。考虑下面的最小可重现示例:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
ex1 = pd.DataFrame({'x':[330,342,344,352,354,371,388,394,401,412,414,448,462,502,504,522,622],
                    'y':[2,9,0,2,2,1,0,4,7,6,8,4,2,6,3,5,7],
                    'ind':[0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0]})
ax.bar(ex1.x,ex1.y,width=0.9)
fig.savefig('some/path')

当我打开该图时,得到以下信息:

python - Matplotlib忽略采样数据帧上的宽度-LMLPHP

这看起来很棒。没有问题。但是现在,假设我只想为部分数据创建条形图。本质上,DF的“ind”列中的所有前导0都包含我不希望绘制的行。因此,我摆脱了这些,然后重试:
fig, ax = plt.subplots()
firstrow = ex1[ex1.ind==np.max(ex1.ind)].index.to_list()[0]
ex1 = ex1[firstrow:]
ax.bar(ex1.x,ex1.y,width=0.9)
fig.savefig('some/other/location')

当我打开那张图时,我希望得到原始图的截断版本,即具有正确高度的细条,而没有从DF切出的几条。相反,我得到这个:

python - Matplotlib忽略采样数据帧上的宽度-LMLPHP

??它从正确的地方开始,但这就是我能说的一切。看起来好像只是忽略width参数并一起运行所有条形图。我玩了几件事,做了一些搜索,无法找出问题所在或解决方法。关于如何使第二个数字看起来像第一个数字的任何建议,但如果没有我不想要的数据,将不胜感激!

编辑为回答任何问题:
打印结果(ex1.x); print(exq.y)是:
print(ex1.x); print(ex1.y)
5     371
6     388
7     394
8     401
9     412
10    414
11    448
12    462
13    502
14    504
15    522
16    622
Name: x, dtype: int64
5     1
6     0
7     4
8     7
9     6
10    8
11    4
12    2
13    6
14    3
15    5
16    7
Name: y, dtype: int64

最佳答案

当matplotlib尝试支持直接绘制 Pandas 对象时,如果 Pandas 更改某些内部结构,有时可能会出现问题。解决此类问题的方法总是返回到绘制numpy数组,所有功能都经过了良好的测试。

这里的问题是,对于 Pandas / matplotlib版本的某些组合,绘制非零索引的数据帧或序列可能会引起异常。

因此,您需要绘制numpy数组ex1.x.valuesex1.y.values,而不是 Pandas 系列ex1.xex1.y:

ax.bar(ex1.x.values, ex1.y.values, width=0.9)

10-04 21:04
查看更多