#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()