通过循环遍历数据帧来堆叠 Seaborn Catplot
stacking Seaborn Catplot by looping through dataframes
我有多个数据框,由三个主要列组成: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("")
sns.boxplot中的hue参数呢?这会给你想要的结果吗?
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()
一种方法是堆叠数据帧并在 catplot
中使用 row=
参数。首先创建类似您的数据的东西:
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,50),"Period":np.random.choice(['AA','CC','DD'],50)})
df2 = pd.DataFrame({'Cat':np.random.choice(['C1','C2','C3'],50),
'Data':np.random.uniform(0,1,50),"Period":np.random.choice(['AA','CC','DD'],50)})
df3 = pd.DataFrame({'Cat':np.random.choice(['C1','C2','C3'],50),
'Data':np.random.uniform(0,1,50),"Period":np.random.choice(['AA','CC','DD'],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)
我有多个数据框,由三个主要列组成: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("")
sns.boxplot中的hue参数呢?这会给你想要的结果吗?
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()
一种方法是堆叠数据帧并在 catplot
中使用 row=
参数。首先创建类似您的数据的东西:
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,50),"Period":np.random.choice(['AA','CC','DD'],50)})
df2 = pd.DataFrame({'Cat':np.random.choice(['C1','C2','C3'],50),
'Data':np.random.uniform(0,1,50),"Period":np.random.choice(['AA','CC','DD'],50)})
df3 = pd.DataFrame({'Cat':np.random.choice(['C1','C2','C3'],50),
'Data':np.random.uniform(0,1,50),"Period":np.random.choice(['AA','CC','DD'],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)