Matplotlib-具有奇怪的错误/问题,试图绘制多个条形图

时间:2018-09-30 21:24:12

标签: matplotlib bar-chart

在这里相当不讲究,我在pandas数据框中具有数据,该数据具有人们对各种事物的评分(满分5分)。我正在尝试使用matplotlib水平绘制条形,每个问题(在y上)的每个人彼此相邻的3个条形,分数在x上。根据官方文档和其他资料,我只需要在y上加上一些数字就可以将条形移动一点,但这给了我一个奇怪的错误,说它必须是字符串。谁能告诉我我在做什么错?

数据如下:

name  thing_1  thing_2  thing_3
John  4        3        1
Jane  5        2        4
Bob   3        3        4

和代码

fig,ax = plt.subplots(figsize=(11,10))
y1 = data.iloc[:,1:].columns
x1 = data.iloc[0:1,1:].sum(axis=0)

y2 = data.iloc[:,1:].columns
x2 = data.iloc[1:2,1:].sum(axis=0)

y3 = data.iloc[:,1:].columns
x3 = data.iloc[2:,1:].sum(axis=0)

width = 0.3

ax.barh(y,x,width,align='center')
ax.barh(y+0.3,x,width,align='center')
ax.barh(y+0.6,x,width,align='center')

plt.xlabel('Score')
plt.ylabel('Bodypart')
plt.title('Body part total score')
plt.legend(data['name'].values)
plt.show()

和错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-217-a7f65a43c075> in <module>()
     45 
     46 ax.barh(y,x,width,align='center')
---> 47 ax.barh(y+0.3,x,width,align='center')
     48 ax.barh(y+0.6,x,width,align='center')
     49 

~/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py in __add__(self, other)
   2684 
   2685     def __add__(self, other):
-> 2686         return Index(np.array(self) + other)
   2687 
   2688     def __radd__(self, other):

TypeError: must be str, not float

1 个答案:

答案 0 :(得分:0)

仅在修补后即可运行代码:

fig,ax = plt.subplots(figsize=(11,10))
y = np.arange(1, 4)
names = data.iloc[:,1:].columns

x = data.iloc[0:1,1:].sum(axis=0)
x2 = data.iloc[1:2,1:].sum(axis=0)
x3 = data.iloc[2:,1:].sum(axis=0)

width = 0.3

ax.barh(y,x,width,align='center', tick_label=names)
ax.barh(y+0.3,x2,width,align='center')
ax.barh(y+0.6,x3,width,align='center')

plt.xlabel('Score')
plt.ylabel('Bodypart')
plt.title('Body part total score')
plt.legend(data['name'].values)
plt.show()

但是,我认为这应该是可优化的...

编辑:这就是方法。导入数据,使name不是第四列,而是数据框的索引:

df = data.drop(columns='name')

df
   thing_1  thing_2  thing_3
0        4        3        1
1        5        2        4
2        3        3        4

df.index=data.name

df
      thing_1  thing_2  thing_3
name                           
John        4        3        1
Jane        5        2        4
Bob         3        3        4

那你就可以做

df.plot(kind='barh')

并获得

enter image description here