показать текстовое описание по оси x, а не числа, используя pandas matplotlib - PullRequest
0 голосов
/ 08 июня 2018

Я написал код для отображения моих данных в виде гистограммы.это мой код: я прочитал мои данные из CSV-файла следующим образом:

names = ["Clinic Number","Question Text","Answer Text","Answer Date","Class"]
data = pd.read_csv('ADLCI.csv', names = names)

А затем

grouped = data.groupby(['Question Text','Answer Text']).size().reset_index(name='counts')

import matplotlib.pyplot as plt
plt.figure()

grouped.plot(kind='bar', title ="Functional Status Count", figsize=(15, 10), legend=True, fontsize=12)
plt.show()

Это также результат фрейма данных, который у меня естьхочу показать в виде гистограммы.

                         Question Text Answer Text  counts
0                          CI function          No     513
1                          CI function         Yes     373
2                             bathing?          No    2827
3                             bathing?         Yes     408
4                            dressing?          No    2824
5                            dressing?         Yes     423
6                              feeding          No    2851
7                              feeding         Yes     160
8                         housekeeping          No    2803
9                         housekeeping         Yes     717
10                      preparing food          No    2604
11                      preparing food         Yes     593
12  responsibility for own medications          No    2793
13  responsibility for own medications         Yes     625
14                            shopping          No      35
15                            shopping         Yes      49
16                           toileting          No    2843
17                           toileting         Yes     239
18                        transferring          No    2834
19                        transferring         Yes     904
20                using transportation          No    2816
21                using transportation         Yes     483

первый столбец с номером был добавлен автоматически, на самом деле у меня его нет в моем наборе данных.

Вот гистограмма, созданная этим кодом.enter image description here

Как вы видите на гистограмме, все бары имеют одинаковый цвет.также ось х - это число, которое я говорил.но я не хочу в этой форме.что я хочу, так это выглядеть как эта ссылка :

Я собираюсь объяснить, какие изменения я хочу внести в изображение, которое я загрузил здесь.

Вместо 0 и 1... на оси x должен отображаться столбец Question Text.Подробно, столбчатая диаграмма по оси x будет: как мы видим в кадре данных, есть два CI function один для yes и один для No.Я хочу CI function вместо 0 и 1 с двумя разными цветами, один указывает на счет No 1596, а другой - на Yes 1376.

Следующим элементом будет bathing?, снова один столбец указывает на 17965, а другой - на 702.

При этом у меня должно быть почти десять столбцов, каждый из которых содержит два столбца.придерживайтесь друг друга, как ссылка, которую я поставил выше.

Я пробовал различные способы, такие как приведенная выше ссылка, но мой не показывал подобное или получал ошибку.

Спасибо :))

Обновление 1 , когда я применил ваш код:

import matplotlib.pyplot as plt
data.groupby(['Question Text','Answer Text']).sum().unstack().plot(kind='bar')
plt.show()

Я получил эту ошибку:

  Traceback (most recent call last):
  File "C:/Users/M193053/PycharmProjects/ADL-distribution/test.py", line 52, in <module>
    data.groupby(['Question Text','Answer Text']).sum().unstack().plot(kind='bar')
  File "C:\Users\M193053\Documents\Anaconda3\envs\conda3\lib\site-packages\pandas\plotting\_core.py", line 2941, in __call__
    sort_columns=sort_columns, **kwds)
  File "C:\Users\M193053\Documents\Anaconda3\envs\conda3\lib\site-packages\pandas\plotting\_core.py", line 1977, in plot_frame
    **kwds)
  File "C:\Users\M193053\Documents\Anaconda3\envs\conda3\lib\site-packages\pandas\plotting\_core.py", line 1804, in _plot
    plot_obj.generate()
  File "C:\Users\M193053\Documents\Anaconda3\envs\conda3\lib\site-packages\pandas\plotting\_core.py", line 258, in generate
    self._compute_plot_data()
  File "C:\Users\M193053\Documents\Anaconda3\envs\conda3\lib\site-packages\pandas\plotting\_core.py", line 373, in _compute_plot_data
    'plot'.format(numeric_data.__class__.__name__))
TypeError: Empty 'DataFrame': no numeric data to plot

, но когда я использую этот код:

grouped = data.groupby(['Question Text','Answer Text']).size().reset_index(name='counts')

import matplotlib.pyplot as plt
grouped.groupby(['Question Text','Answer Text']).sum().unstack().plot(kind='bar')
plt.show()

Мне кажется, что все в порядке: enter image description here

, но не представляется логичным применять две группы.из-за этого я все еще не уверен, что мне делать.Спасибо, что нашли время:)

Обновите два

это мой фрейм данных, был получен с этим кодом:

grouped = data.groupby(['Question Text','Answer Text']).size().reset_index(name='counts')

0                          CI function          No     513
1                          CI function         Yes     373
2                             bathing?          No    2827
3                             bathing?         Yes     408
4                            dressing?          No    2824
5                            dressing?         Yes     423
6                              feeding          No    2851
7                              feeding         Yes     160
8                         housekeeping          No    2803
9                         housekeeping         Yes     717
10                      preparing food          No    2604
11                      preparing food         Yes     593
12  responsibility for own medications          No    2793
13  responsibility for own medications         Yes     625
14                            shopping          No      35
15                            shopping         Yes      49
16                           toileting          No    2843
17                           toileting         Yes     239
18                        transferring          No    2834
19                        transferring         Yes     904
20                using transportation          No    2816
21                using transportation         Yes     483

и этофрейм данных, полученный из комбинации вашего кода и моего:

grouped = data.groupby(['Question Text','Answer Text']).size().reset_index(name='counts')
print(grouped)
import matplotlib.pyplot as plt
final = grouped.groupby(['Question Text','Answer Text']).sum()
print(final)


Question Text                      Answer Text        
CI function                        No              513
                                   Yes             373
bathing?                           No             2827
                                   Yes             408
dressing?                          No             2824
                                   Yes             423
feeding                            No             2851
                                   Yes             160
housekeeping                       No             2803
                                   Yes             717
preparing food                     No             2604
                                   Yes             593
responsibility for own medications No             2793
                                   Yes             625
shopping                           No               35
                                   Yes              49
toileting                          No             2843
                                   Yes             239
transferring                       No             2834
                                   Yes             904
using transportation               No             2816
                                   Yes             483

Обновление 3

Исходный фрейм данных содержит 200000 строк, например:

1                             bathing?          No       3529933
2                            dressing?          No       3529933
3                              feeding          No       3529933
4                         housekeeping          No       3529933
5   responsibility for own medications          No       3529933
6                 using transportation          No       3529933
7                            toileting          No       3529933
8                         transferring          No       3529933
10                      preparing food          No       3529933
11                            bathing?         NaN       2864155
12                           dressing?         NaN       2864155
13                             feeding         NaN       2864155
14                        housekeeping         NaN       2864155
15  responsibility for own medications         NaN       2864155
16                           toileting         NaN       2864155
17                        transferring         NaN       2864155
19                      preparing food         NaN       2864155
20                using transportation         Yes       2864155
21                            bathing?         NaN       2921299
22                           dressing?         NaN       2921299

1 Ответ

0 голосов
/ 09 июня 2018

Вы можете сделать это (df это записанный вами фрейм данных):

import matplotlib
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
df.groupby(['Question Text','Answer Text']).sum().unstack().plot(kind='bar')
plt.show()

Вывод: enter image description here Вы также можете вращать xlabel следующим образом:

plt.xticks(rotation=45)

но я предлагаю вам сделать ярлыки короче, чтобы сделать их более четкими

...