Как правильно построить гистограмму в кадре данных Pandas? Значения x продолжают отображаться как индекс - PullRequest
2 голосов
/ 01 августа 2020

У меня есть небольшой фрейм данных, в котором в качестве столбцов указаны student_id, exc_1, exc_2, exc_3, exc_4 и exc_5. В рядах тоже 5 учеников. Что я хотел бы сделать, так это построить гистограмму, показывающую оценки за экзамен одного студента или одну конкретную c строку, и, в конечном итоге, сделать это для каждого или определенного c студента на основе ввода пользователя.

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

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'student_id': [83838, 16373, 93538, 29383, 58585],
                   'exam_1': [80, 95, 90, 75, 50],
                   'exam_2': [60, 92, 88, 85, 40],
                   'exam_3': [70, 55, 75, 45, 60],
                   'exam_4': [55, 95, 45, 80, 55],
                   'exam_5': [91, 35, 92, 90, 75]})

print(df)

Результат:

  student_id  exam_1  exam_2  exam_3  exam_4  exam_5
0       83838      80      60      70      55      91
1       16373      95      92      55      95      35
2       93538      90      88      75      45      92
3       29383      75      85      45      80      90
4       58585      50      40      60      55      75

Добавление приведенный ниже код позволит мне выбрать только один конкретный c идентификатор студента, также известный как строка:

df = df.loc[df['student_id'] == 29383]
print(df)
   student_id  exam_1  exam_2  exam_3  exam_4  exam_5
3       29383      75      85      45      80      90

Отсюда я хотел бы отобразить экзамены этого конкретного студента в виде столбчатой ​​диаграммы.

Я пробовал приведенный ниже код, но он не отображает его так, как хотелось бы. Кажется, что индекс этого конкретного ученика используется для отметки на оси x, если вы видите изображение. Он покажет «3» с несколькими столбчатыми графиками вокруг него.

exam_plots_for_29383 = df.plot.bar()
plt.show()

Будет выведен этот столбчатый график: Dataframe с столбчатым графиком. Выглядит странно.

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

df = df.T
exam_plots_for_29383_T = df.plot.bar()
plt.show()

Но я получаю это в виде графика: Транспонирование фрейма данных с гистограммой. Все еще выглядит странно.

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

Я бы хотел, чтобы гистограмма имела:

  • Экзамены с 1 по 5 отображаются на оси X.
  • Их значения на оси Y.
  • Каждая полоса исследования выделена отдельным цветом.
  • Легенда, показывающая цвета.

Я думаю, что последние два варианта выполняются автоматически. Только первые два ломают мне мозг. Я благодарен за любую помощь или советы.

Вот полный код на тот случай, если кто-то захочет увидеть его без разделения, как указано выше.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'student_id': [83838, 16373, 93538, 29383, 58585],
                   'exam_1': [80, 95, 90, 75, 50],
                   'exam_2': [60, 92, 88, 85, 40],
                   'exam_3': [70, 55, 75, 45, 60],
                   'exam_4': [55, 95, 45, 80, 55],
                   'exam_5': [91, 35, 92, 90, 75]})

print(df)

df = df.loc[df['student_id'] == 29383]
print(df)

exam_plots_for_29383 = df.plot.bar()
plt.show()

df = df.T
exam_plots_for_29383_T = df.plot.bar()
plt.show()  

1 Ответ

2 голосов
/ 01 августа 2020

Вы очень близки. Проблема в том, что ваш номер студента, подобный номеру c, портит все графики (вот почему ID 29383 дает вам полосу, близкую к 30 000 на всех ваших графиках).

Установите ' student_id 'в индекс, чтобы он не был нанесен на график, и теперь вы можете построить график каждого студента отдельно, разрезая индекс с помощью .loc[student_id], или, если вы построите весь DataFrame, он будет окрашивать каждого другого студента.

df = df.set_index('student_id')
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30)

enter image description here

Knowing there are 5 exams you can give each its own color if you really want. Use a categorical color palette (tab10). (This also only works with Series.plot)

from matplotlib import cm
df.loc[29383].plot(kind='bar', figsize=(4,3), rot=30, color=cm.tab10.colors[0:5])

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...