在这里相当不讲究,我在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
答案 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')
并获得