在seaborn中绘制多个箱线图?

Posted

技术标签:

【中文标题】在seaborn中绘制多个箱线图?【英文标题】:Plotting multiple boxplots in seaborn? 【发布时间】:2017-11-17 01:28:22 【问题描述】:

我想在 pandas 中使用 seaborn 绘制箱线图,因为它是一种更好的数据可视化方式,但我对它不太熟悉。我有三个不同指标的数据框,我想比较不同的指标。我将遍历文件路径来访问它们。

for path in paths: 
   df = pd.read_csv(path)

每个指标的 dfs 都是独立的,看起来像这样(其中 .... 表示填充的数据值)。 1、2、3、4、5是列名,表示不同的试验:

    1  2  3  4  5
0   ..............
1   ..............
2   ..............
3   ..............
4   ..............

我想让试验 1、2、3、4、5 和 3 个指标中的每一个的所有图并排,其中三个指标的所有第一个试验图都在左侧,然后所有第二个试验地块将在其右侧,依此类推。

我怎么能在 seaborn 中做到这一点?我知道我可以通过循环遍历路径并使用 boxplot 函数为每个指标单独绘制图,如下所示:

sns.boxplot(data=df)   

但是,我如何才能在同一个图上并排拟合其他指标的图?

【问题讨论】:

您可能希望将数据框合并为一个并使用boxplothue 参数。如果您需要帮助,您应该提供问题的minimal reproducible example。 【参考方案1】:

考虑首先为每个相应的数据框分配一个分组列,如 Trial,然后 pd.concat 您的数据框,最后是 pd.melt 为指标/值长期数据框的数据,然后再使用 seaborn 进行绘图.下面用随机数据演示:

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

np.random.seed(44)
# DATAFRAMES WITH TRIAL COLUMN ASSIGNED
df1 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=1)
df2 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=2)
df3 = pd.DataFrame(np.random.randn(5,5), columns=list(range(1,6))).assign(Trial=3)

cdf = pd.concat([df1, df2, df3])                                # CONCATENATE
mdf = pd.melt(cdf, id_vars=['Trial'], var_name=['Number'])      # MELT

print(mdf.head())
#    Trial Number     value
# 0      1      1 -0.750615
# 1      1      1 -1.715070
# 2      1      1 -0.963404
# 3      1      1  0.360856
# 4      1      1 -1.190504

ax = sns.boxplot(x="Trial", y="value", hue="Number", data=mdf)  # RUN PLOT   
plt.show()

plt.clf()
plt.close()

【讨论】:

【参考方案2】:
# libraries
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from random import randint, gauss

# create a DataFrame
df = pd.DataFrame(
    'Sensations':[randint(1,3) for i in range(300)]
)
df['Temperature'] = df['Sensations'].map(lambda x: gauss(0.8/x,0.1)*40)
df['Sensations'] = df['Sensations'].map(1:'hot',2:'normal',3:'cold')

# create plot
ax = sns.boxplot(x="Sensations", y="Temperature", data=df)

# show plot
plt.show()

【讨论】:

请提供您作为答案发布的代码的一些解释。

以上是关于在seaborn中绘制多个箱线图?的主要内容,如果未能解决你的问题,请参考以下文章

使用 seaborn 或 matplotlib 分组箱线图的数据格式

当输入是 DataFrame 时在 seaborn 中对箱线图进行分组

如何绘制每个月和年的 seaborn 箱线图

具有多个类别的箱线图和小提琴图

使用色调和不同比例轴的 Seaborn(时间序列)箱线图

基于 DataFrame 列名的颜色 seaborn 箱线图