график seaborn для фрейма данных pandas

#pandas #dataframe #matplotlib #seaborn

#pandas #фрейм данных #matplotlib #seaborn

Вопрос:

У меня есть фрейм данных pandas для результатов экзаменов в старших классах, в котором хранится раса пользователя (типы a, b, c, d) и их оценки по физике, математике и английскому языку. Я хочу создать единый график с использованием графиков Сиборна, который покажет, как раса человека соответствует СРЕДНИМ баллам по математике, химии и физике? Я прикрепил изображение ниже к фрейму данных примера, но в нем просто нет столбца race, но представьте, что у него есть столбец для race, и его типы были (A, B, C, D).

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

Думал об использовании гистограммы с категориями рас по оси x, но как мне получить разные столбцы для каждого среднего балла по предмету таким же образом, как «оттенок» используется для пола в этом примере ниже введите описание изображения здесь

Нужно знать, есть ли другой, более подходящий график, который я могу использовать? и как бы я это реализовал

Комментарии:

1. Можете ли вы предоставить изображение для желаемого результата? Возможно, вы хотели включить изображение из документации seaborn.barplot? Я отредактировал вопрос так, как, я полагаю, будет выглядеть ваш желаемый результат

2. @DeReKo — Я не уверен, что ваше существенное редактирование было оправдано. Ответственность за предоставление разъяснений лежит на OP. Ваша интерпретация может быть совершенно неверной, а также вкладывает слова в уста OP, которых там не было. Пожалуйста, не делайте этого. Если что, вы можете предложить это в комментарии, но редактирование его в вопросе неуместно. Я откатился до вашего существенного редактирования.

3. @BigBen хорошо, это справедливое замечание. в будущем я буду избегать чрезмерных изменений

Ответ №1:

Сначала вам нужно разделить столбцы Chemistry, Physics, Math на два столбца: один столбец идентификатора и другой столбец с соответствующими значениями.

 import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

## recreate your DataFrame
df = pd.DataFrame({
    'Name':list("QWERTYUI"),
    'Student ID': list(range(12001,12009)),
    'Race':list('ABCDABCD'),
    'Chemistry': [59,54,42,66,60,78,64,82],
    'Physics': [90,42,88,48,80,73,43,69],
    'Math': [45,85,54,64,72,64,67,70]
})

df_melted = pd.melt(df, id_vars=['Name','Student ID','Race'], value_vars=['Chemistry','Physics','Math'])
 

Здесь вы можете увидеть разницу между тем, как структурированы два фрейма данных:

 >>> df
  Name  Student ID Race  Chemistry  Physics  Math
0    Q       12001    A         59       90    45
1    W       12002    B         54       42    85
2    E       12003    C         42       88    54
3    R       12004    D         66       48    64
4    T       12005    A         60       80    72
5    Y       12006    B         78       73    64
6    U       12007    C         64       43    67
7    I       12008    D         82       69    70

>>> df_melted
   Name  Student ID Race   variable  value
0     Q       12001    A  Chemistry     59
1     W       12002    B  Chemistry     54
2     E       12003    C  Chemistry     42
3     R       12004    D  Chemistry     66
4     T       12005    A  Chemistry     60
5     Y       12006    B  Chemistry     78
6     U       12007    C  Chemistry     64
7     I       12008    D  Chemistry     82
8     Q       12001    A    Physics     90
9     W       12002    B    Physics     42
10    E       12003    C    Physics     88
11    R       12004    D    Physics     48
12    T       12005    A    Physics     80
13    Y       12006    B    Physics     73
14    U       12007    C    Physics     43
15    I       12008    D    Physics     69
16    Q       12001    A       Math     45
17    W       12002    B       Math     85
18    E       12003    C       Math     54
19    R       12004    D       Math     64
20    T       12005    A       Math     72
21    Y       12006    B       Math     64
22    U       12007    C       Math     67
23    I       12008    D       Math     70
 

Затем вы можете вызвать sns.barplot со следующими аргументами:

 ax = sns.barplot(x="Race", y="value", hue="variable", data=df_melted)
plt.show()
 

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