我建议使用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()

您也可以只使用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()

这会给你同样的情节,都在同一个人物,而不是次要情节。它还允许您用一行更改图形的标题。不幸的是,我找不到一种方法来删除'列'字幕,但希望这会得到你所需要的。
编辑
侧身查看图: Factorplot 交换你x
和y
值,改变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()
Boxplot 更换您的x
和y
值然后添加参数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()

的感谢!有没有办法垂直显示图而非水平?我不需要1X5的情节,而是需要转置并用'factorplot'获得5X1情节? –
是的!请参阅我的编辑。 –