与熊猫并排的箱形图

时间:2017-07-07 16:07:26

标签: python pandas boxplot

我需要绘制五个变量的比较,存储在pandas 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'分组的Boxplot)
  • 摆脱沿着水平线绘制的令人讨厌的[cls]
  • 对绘制的类别重新排序,因为它们出现在df1中? (第一个敏感度,然后是特定的...)

2 个答案:

答案 0 :(得分:3)

我建议使用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的漂亮工具,它创建了一个子图的网格,其中的行/列用您的数据构建。为了能够做到这一点,我们需要将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}'更改为{ {1}}喜欢这样

'{row_name}'

h factorplot 箱形图 交换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() x值,然后像这样添加参数y

orient = 'h'

h boxplot

答案 1 :(得分: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