通过循环遍历数据帧来堆叠 Seaborn Catplot

问题描述

我有多个数据框由三个主要列组成:1)类别(c1、c2、c3),一个包含数据值,一个包含不同的时间段(AA、BB、CC、DD)。

我试图生成的是为所有数据框生成数据的箱线图,一次,并在一个图中! 我确实尝试了不同的枚举选项和“ax”参数,但它仍然单独生成箱线图,我无法弄清楚。

allCN=[df1,df2,df3]
fig,axs = plt.subplots(nrows = 3,ncols=4,figsize = (30,54))
axes = axes.flatten()

for i,x in enumerate(allCN):

    sns.set(style="ticks",palette='Set2')
    sns.set_context("paper",font_scale=1.1,rc={"lines.linewidth": 1.1})

    g=sns.catplot(x="Cat",y="Data",ax=axs[i,0],col="Period",data=x,kind="Box",height=4,aspect=10/18,width=0.6,fliersize=2.5,showfliers=False,linewidth=1.1,notch=False,orient="v"))
    g.set_ylabels("test",size=12)
    g.set_xlabels("")

example output

解决方法

sns.boxplot 中的色调参数怎么样?这会给你想要的结果吗?

enter image description here

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
box_plot = sns.boxplot(x="day",y="total_bill",data=tips,hue="smoker")
plt.show()
,

一种方法是堆叠数据框并在 row= 中使用 catplot 参数。首先创建类似于您的数据的内容:

import pandas as pd
import numpy as np
import seaborn as sns

df1 = pd.DataFrame({'Cat':np.random.choice(['C1','C2','C3'],50),'Data':np.random.uniform(0,1,"Period":np.random.choice(['AA','CC','DD'],50)})

df2 = pd.DataFrame({'Cat':np.random.choice(['C1',50)})

df3 = pd.DataFrame({'Cat':np.random.choice(['C1',50)})

然后连接数据框并添加另一列(我在下面使用源)来注释数据框:

allCN=pd.concat([df1,df2,df3])
allCN['source'] = np.repeat(['df1','df2','df3'],[len(df1),len(df2),len(df3)])

sns.catplot(x="Cat",y="Data",col="Period",row = "source",data=allCN,kind="box",height=2,aspect=1.6)

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...