我以为肯定可以找到答案,但是我找不到它。尝试使用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')
当我打开该图时,得到以下信息:
这看起来很棒。没有问题。但是现在,假设我只想为部分数据创建条形图。本质上,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切出的几条。相反,我得到这个:
??它从正确的地方开始,但这就是我能说的一切。看起来好像只是忽略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.values
和ex1.y.values
,而不是 Pandas 系列ex1.x
和ex1.y
:
ax.bar(ex1.x.values, ex1.y.values, width=0.9)