Matplotlib - странные ошибки / проблемы, которые пытаются построить несколько баров - PullRequest
0 голосов
/ 01 октября 2018

довольно нубистский здесь, у меня есть данные в пандас-фрейме данных, в котором есть данные, которые имеют оценку людей (из 5) по различным вещам.Я пытаюсь использовать matplotlib для построения столбцов по горизонтали, по 3 столбца рядом друг с другом для каждого человека по одному вопросу (по y) со счетом по 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 голосов
/ 01 октября 2018

Сразу после установки патча для запуска кода:

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 был не 4-м столбцом, а индексом фрейма данных:

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

...