簡體   English   中英

如何獲得分類數據的分組條形圖

[英]How to get a grouped bar plot of categorical data

我有一個包含學生信息的大數據集。 我必須構建不同值之間的依賴關系圖。 例如,我有兩列“Year”和“School”,比如圖片

它創建了一個類似於:

這

我的真實數據

數據集 .

我可以過濾我的值,但我不知道如何構建和組合圖形。 它不起作用......我發現示例看起來像這樣,但我無法解決我的問題。

問題是我需要將一列的數據鏈接到第二列的過濾數據,而不更改數據集。 我找不到類似的解決方案。

import pandas as pd


df = pd.read_excel('CREDITATION.xlsx')

plt.title('Depends schools in years')
plt.xlabel('Schools')
plt.ylabel('Counts')
plt.xticks(df['SCHOOL_YEAR_MOBILITY'])
plt.yticks(np.arange(0, 1000, step=100))

bar_width = 0.35



agr2016 = df.loc[(df['SCHOOL'] == 'Escola Superior Agrária de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2016)].count()[0] 
agr2017 = df.loc[(df['SCHOOL'] == 'Escola Superior Agrária de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2017)].count()[0] 
agr2018 = df.loc[(df['SCHOOL'] == 'Escola Superior Agrária de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2018)].count()[0] 
agr2019 = df.loc[(df['SCHOOL'] == 'Escola Superior Agrária de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2019)].count()[0] 
agr2020 = df.loc[(df['SCHOOL'] == 'Escola Superior Agrária de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2020)].count()[0] 

manag2016 = df.loc[(df['SCHOOL'] == 'Escola Superior de Tecnologia e Gestão de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2016)].count()[0]
manag2017 = df.loc[(df['SCHOOL'] == 'Escola Superior de Tecnologia e Gestão de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2017)].count()[0]
manag2018 = df.loc[(df['SCHOOL'] == 'Escola Superior de Tecnologia e Gestão de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2018)].count()[0]
manag2019 = df.loc[(df['SCHOOL'] == 'Escola Superior de Tecnologia e Gestão de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2019)].count()[0]
manag2020 = df.loc[(df['SCHOOL'] == 'Escola Superior de Tecnologia e Gestão de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2020)].count()[0]

com2016 = df.loc[(df['SCHOOL'] == 'Escola Superior de Comunicação, Administração e Turismo')&(df['SCHOOL_YEAR_MOBILITY'] == 2016)].count()[0]
com2017 = df.loc[(df['SCHOOL'] == 'Escola Superior de Comunicação, Administração e Turismo')&(df['SCHOOL_YEAR_MOBILITY'] == 2017)].count()[0]
com2018 = df.loc[(df['SCHOOL'] == 'Escola Superior de Comunicação, Administração e Turismo')&(df['SCHOOL_YEAR_MOBILITY'] == 2018)].count()[0]
com2019 = df.loc[(df['SCHOOL'] == 'Escola Superior de Comunicação, Administração e Turismo')&(df['SCHOOL_YEAR_MOBILITY'] == 2019)].count()[0]
com2020 = df.loc[(df['SCHOOL'] == 'Escola Superior de Comunicação, Administração e Turismo')&(df['SCHOOL_YEAR_MOBILITY'] == 2020)].count()[0]

health2016 = df.loc[(df['SCHOOL'] == 'Escola Superior de Saúde de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2016)].count()[0] 
health2017 = df.loc[(df['SCHOOL'] == 'Escola Superior de Saúde de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2017)].count()[0] 
health2018 = df.loc[(df['SCHOOL'] == 'Escola Superior de Saúde de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2018)].count()[0] 
health2019 = df.loc[(df['SCHOOL'] == 'Escola Superior de Saúde de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2019)].count()[0] 
health2020 = df.loc[(df['SCHOOL'] == 'Escola Superior de Saúde de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2020)].count()[0] 

education2016 = df.loc[(df['SCHOOL'] == 'Escola Superior de Educação de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2016)].count()[0]
education2017 = df.loc[(df['SCHOOL'] == 'Escola Superior de Educação de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2017)].count()[0]
education2018 = df.loc[(df['SCHOOL'] == 'Escola Superior de Educação de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2018)].count()[0]
education2019 = df.loc[(df['SCHOOL'] == 'Escola Superior de Educação de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2019)].count()[0]
education2020 = df.loc[(df['SCHOOL'] == 'Escola Superior de Educação de Bragança')&(df['SCHOOL_YEAR_MOBILITY'] == 2020)].count()[0]

plt.bar() #idk
plt.show()

導入和示例數據

import pandas as pd
import seaborn as sns
import numpy as np  # for test data only

np.random.seed(365)
rows = 100
data = {'year': np.random.choice(range(2016, 2021), size=rows),
        'school': np.random.choice(['a', 'b', 'c', 'd', 'e'], size=rows)}
df = pd.DataFrame(data)

# display(df.head())
   year school
0  2018      a
1  2020      b
2  2017      b
3  2019      b
4  2020      c

使用seaborn.countplot

# plot and add annotations
p = sns.countplot(data=df, x='year', hue='school')
p.legend(title='School', bbox_to_anchor=(1, 1), loc='upper left')

for c in p.containers:
    # set the bar label
    p.bar_label(c, fmt='%.0f', label_type='edge')

在此處輸入圖片說明

使用pandas.DataFrame.plot

dfp = df.pivot_table(index='year', columns='school', values='school', aggfunc='size')

ax = dfp.plot(kind='bar', rot=0)

ax.legend(title='School', bbox_to_anchor=(1, 1), loc='upper left')

for c in ax.containers:
    # set the bar label
    ax.bar_label(c, fmt='%.0f', label_type='edge')

在此處輸入圖片說明

# groupby and pivot
ax = df.groupby(['year']).school.value_counts().reset_index(name='counts').pivot(index='year', columns='school', values='counts').plot(kind='bar')

# crosstab
ax = pd.crosstab(df.year, df.school).plot(kind='bar')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM