Seaborn.countplot:按计数订购类别,也按类别订购?

时间:2019-03-29 13:43:51

标签: python pandas plot seaborn

因此,我了解如何根据条形图(即here)进行排序。我找不到的是如何按子类别之一对条形图进行排序。

例如,给定以下数据框,我可以获得条形图。但是我想做的是按照Type中的Classic从最大到最小排序。

import pandas as pd

test_df = pd.DataFrame([
['Jake',    38, 'MW',   'Classic'],
['John',    38,'NW',    'Classic'],
['Sam', 34, 'SE',   'Classic'],
['Sam', 22, 'E' ,'Classic'],
['Joe', 43, 'ESE2', 'Classic'],
['Joe', 34, 'MTN2', 'Classic'],
['Joe', 38, 'MTN2', 'Classic'],
['Scott',   38, 'ESE2', 'Classic'],
['Chris',   34, 'SSE1', 'Classic'],
['Joe', 43, 'S1',   'New'],
['Paul',    34, 'NE2',  'New'],
['Joe', 38, 'MC1',  'New'],
['Joe', 34, 'NE2',  'New'],
['Nick',    38, 'MC1',  'New'],
['Al',  38, 'SSE1', 'New'],
['Al',  34, 'ME',   'New'],
['Al',  34, 'MC1',  'New'],
['Joe', 43, 'S1',   'New']], columns = ['Name','Code_A','Code_B','Type'])


import seaborn as sns
sns.set(style="darkgrid")
palette ={"Classic":"#FF9999","New":"#99CC99"}


g = sns.countplot(y="Name",
                  palette=palette,
                  hue="Type",
                  data=test_df)

所以代替:

enter image description here

“ Joe”将排在最前面,然后是“ Sam”等。

2 个答案:

答案 0 :(得分:2)

添加order参数。使用pandas.crosstabsort_values获得以下信息:

import pandas as pd

test_df = pd.DataFrame([
['Jake',    38, 'MW',   'Classic'],
['John',    38,'NW',    'Classic'],
['Sam', 34, 'SE',   'Classic'],
['Sam', 22, 'E' ,'Classic'],
['Joe', 43, 'ESE2', 'Classic'],
['Joe', 34, 'MTN2', 'Classic'],
['Joe', 38, 'MTN2', 'Classic'],
['Scott',   38, 'ESE2', 'Classic'],
['Chris',   34, 'SSE1', 'Classic'],
['Joe', 43, 'S1',   'New'],
['Paul',    34, 'NE2',  'New'],
['Joe', 38, 'MC1',  'New'],
['Joe', 34, 'NE2',  'New'],
['Nick',    38, 'MC1',  'New'],
['Al',  38, 'SSE1', 'New'],
['Doug',    34, 'ME',   'New'],
['Fred',    34, 'MC1',  'New'],
['Joe', 43, 'S1',   'New']], columns = ['Name','Code_A','Code_B','Type'])


import seaborn as sns
sns.set(style="darkgrid")
palette ={"Classic":"#FF9999","New":"#99CC99"}

order = pd.crosstab(test_df.Name, test_df.Type).sort_values('Classic', ascending=False).index
g = sns.countplot(y="Name",
                  palette=palette,
                  hue="Type",
                  data=test_df,
                  order=order
                 )

enter image description here

答案 1 :(得分:0)

import pandas as pd

test_df = pd.DataFrame([
['Jake',    38, 'MW',   'Classic'],
['John',    38,'NW',    'Classic'],
['Sam', 34, 'SE',   'Classic'],
['Sam', 22, 'E' ,'Classic'],
['Joe', 43, 'ESE2', 'Classic'],
['Joe', 34, 'MTN2', 'Classic'],
['Joe', 38, 'MTN2', 'Classic'],
['Scott',   38, 'ESE2', 'Classic'],
['Chris',   34, 'SSE1', 'Classic'],
['Joe', 43, 'S1',   'New'],
['Paul',    34, 'NE2',  'New'],
['Joe', 38, 'MC1',  'New'],
['Joe', 34, 'NE2',  'New'],
['Nick',    38, 'MC1',  'New'],
['Al',  38, 'SSE1', 'New'],
['Al',  34, 'ME',   'New'],
['Al',  34, 'MC1',  'New'],
['Joe', 43, 'S1',   'New']], columns = ['Name','Code_A','Code_B','Type'])


import seaborn as sns
sns.set(style="darkgrid")
palette ={"Classic":"#FF9999","New":"#99CC99"}

sb.countplot(y = 'Name', hue='Type', data=test_df, 
order=test_df['Name'].value_counts().index)

Output