2017-07-07 49 views
0

我需要比較五個變量,存儲在熊貓dataframe。我使用了一個例子from here,它工作,但現在我需要更改軸和標題,但我正在努力這樣做。與熊貓並排的箱櫃

這裏是我的數據:

df1.groupby('cls').head() 
Out[171]: 
    sensitivity specificity accuracy  ppv  auc  cls 
0  0.772091  0.824487 0.802966 0.799290 0.863700  sig 
1  0.748931  0.817238 0.776366 0.785910 0.859041  sig 
2  0.774016  0.805909 0.801975 0.789840 0.853132  sig 
3  0.826670  0.730071 0.795715 0.784150 0.850024  sig 
4  0.781112  0.803839 0.824709 0.791530 0.863411  sig 
0  0.619048  0.748290 0.694969 0.686138 0.713899 baseline 
1  0.642348  0.702076 0.646216 0.674683 0.712632 baseline 
2  0.567344  0.765410 0.710650 0.665614 0.682502 baseline 
3  0.644046  0.733645 0.754621 0.683485 0.734299 baseline 
4  0.710077  0.653871 0.707933 0.684313 0.732997 baseline 

這裏是我的代碼:

>> fig, axes = plt.subplots(ncols=5, figsize=(12, 5), sharey=True) 
>> df1.query("cls in ['sig', 'baseline']").boxplot(by='cls', return_type='axes', ax=axes) 

,所得照片是:

pictures of results

如何:

  • 改變標題(「箱線圖通過電郵宣傳CLS」)
  • 擺脫惱人的[CLS]沿水平線
  • 重新排列繪製類別繪製它們出現在DF1? (第一敏感度,其次是SPECI ...)

回答

1

我建議使用seaborn

下面是一個例子,可以幫助你:

進口

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

品牌數據

data = {'sensitivity' : np.random.normal(loc = 0, size = 10), 
     'specificity' : np.random.normal(loc = 0, size = 10), 
     'accuracy' : np.random.normal(loc = 0, size = 10), 
     'ppv' : np.random.normal(loc = 0, size = 10), 
     'auc' : np.random.normal(loc = 0, size = 10), 
     'cls' : ['sig', 'sig', 'sig', 'sig', 'sig', 'baseline', 'baseline', 'baseline', 'baseline', 'baseline']} 

df = pd.DataFrame(data) 
df 

Seaborn有一個叫做factorplot極好的工具,創建其中行/ COLS與您的數據建立的次要情節的網格。爲了能夠做到這一點,我們需要將df「融化」爲更有用的形狀。

df_melt = df.melt(id_vars = 'cls', 
        value_vars = ['accuracy', 
           'auc', 
           'ppv', 
           'sensitivity', 
           'specificity'], 
        var_name = 'columns') 

現在我們可以使用col「columns」創建factorplot

a = sns.factorplot(data = df_melt, 
        x = 'cls', 
        y = 'value', 
        kind = 'box', # type of plot 
        col = 'columns', 
        col_order = ['sensitivity', # custom order of boxplots 
           'specificity', 
           'accuracy', 
           'ppv', 
           'auc']).set_titles('{col_name}') # remove 'column = ' part of title 

plt.show() 

factorplot

您也可以只使用Seaborn的箱線圖。

b = sns.boxplot(data = df_melt, 
       hue = 'cls', # different colors for different 'cls' 
       x = 'columns', 
       y = 'value', 
       order = ['sensitivity', # custom order of boxplots 
         'specificity', 
         'accuracy', 
         'ppv', 
         'auc']) 

sns.plt.title('Boxplot grouped by cls') # You can change the title here 
plt.show() 

boxplot

這會給你同樣的情節,都在同一個人物,而不是次要情節。它還允許您用一行更改圖形的標題。不幸的是,我找不到一種方法來刪除'列'字幕,但希望這會得到你所需要的。

編輯

側身查看圖: Factorplot 交換你xy值,改變col = 'columns'row = 'columns',改變col_order = [...]row_order = [...],並改變'{col_name}''{row_name}'像這樣

a1 = sns.factorplot(data = df_melt, 
        x = 'value', 
        y = 'cls', 
        kind = 'box', # type of plot 
        row = 'columns', 
        row_order = ['sensitivity', # custom order of boxplots 
           'specificity', 
           'accuracy', 
           'ppv', 
           'auc']).set_titles('{row_name}') # remove 'column = ' part of title 

plt.show() 

h factorplot Boxplot 更換您的xy值然後添加參數orient = 'h'像這樣

b1 = sns.boxplot(data = df_melt, 
       hue = 'cls', 
       x = 'value', 
       y = 'columns', 
       order = ['sensitivity', # custom order of boxplots 
         'specificity', 
         'accuracy', 
         'ppv', 
         'auc'], 
       orient = 'h') 

sns.plt.title('Boxplot grouped by cls') 
plt.show() 

h boxplot

+1

的感謝!有沒有辦法垂直顯示圖而非水平?我不需要1X5的情節,而是需要轉置並用'factorplot'獲得5X1情節? –

+0

是的!請參閱我的編輯。 –

1

也許這可以幫助你:

fig, axes = pyplot.subplots(ncols=4, figsize=(12, 5), sharey=True) 
df.query("E in [1, 2]").boxplot(by='E', return_type='axes', ax=axes, column=list('bcda')) # Keeping original columns order 
pyplot.suptitle('Boxplot') # Changing title 
[ax.set_xlabel('') for ax in axes] # Changing xticks for all plots