如何使用 sns.catplot 在箱线图之上覆盖散点图?

nor*_*ius 5 python seaborn

可以通过简单地连续调用轴级绘图函数来组合它们:

import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
sns.set_theme(style="whitegrid")
ax = sns.boxplot(x="day", y="total_bill", data=tips)
ax = sns.stripplot(x="day", y="total_bill", data=tips, 
                   color=".25", alpha=0.7, ax=ax)
plt.show()
Run Code Online (Sandbox Code Playgroud)

对于图形级功能如何实现这一点sns.catplot()?每次连续调用都会sns.catplot()创建一个新图形,并且不可能传递图形句柄。

# This creates two separate figures:
sns.catplot(..., kind="box")
sns.catplot(..., kind="strip")
Run Code Online (Sandbox Code Playgroud)

nor*_*ius 10

以下内容适用于seaborn v0.11:

import seaborn as sns 
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
g = sns.catplot(x="sex", y="total_bill", hue="smoker", col="time",
                data=tips, kind="box",
                palette=["#FFA7A0", "#ABEAC9"],
                height=4, aspect=.7);
g.map_dataframe(sns.stripplot, x="sex", y="total_bill", 
                hue="smoker", palette=["#404040"], 
                alpha=0.6, dodge=True)
# g.map(sns.stripplot, "sex", "total_bill", "smoker", 
#       palette=["#404040"], alpha=0.6, dodge=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)

说明:在第一遍中,箱线图是使用创建的sns.catplot()。该函数返回一个sns.FacetGrid适应分类参数每个值的不同轴的值time。在第二遍中,它FacetGrid被重新用于覆盖散点图(sns.stripplot,或者sns.swarmplot)。上面使用方法是map_dataframe()因为data它是一个带有命名列的 pandas DataFrame。(或者,map()也可以使用。)设置dodge=True可确保散点图沿着每个hue类别的分类轴移动。最后,请注意,通过调用sns.catplot()withkind="box"然后在第二步中覆盖散点图,可以隐式避免重复图例条目的问题。

结果图

替代方案(不推荐):也可以FacetGrid先创建一个对象,然后调用map_dataframe()两次。虽然这适用于本示例,但在其他情况下,必须确保属性映射在各个方面正确同步(请参阅文档中的警告sns.catplot()照顾这个,以及传说。

g = sns.FacetGrid(tips, col="time", height=4, aspect=.7)
g.map_dataframe(sns.boxplot, x="sex", y="total_bill", hue="smoker", 
                palette=["#FFA7A0", "#ABEAC9"])
g.map_dataframe(sns.stripplot, x="sex", y="total_bill", hue="smoker", 
                palette=["#404040"], alpha=0.6, dodge=True)
# Note: the default legend is not resulting in the correct entries.
#       Some fix-up step is required here...
# g.add_legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)