如何使用类别轴覆盖条形图上的数据点

问题描述

目标:我正在尝试使用Seborn在带有多个分组条形图的图表中显示单个数据点。

问题:我尝试使用条形图的猫图和单个数据点的另一个猫图来完成此操作。但是,这会生成两个数字:一个数字带有条形图,另一个带有单个数据点。

问题:是否有办法使用Seborn将单个数据点与条形图一起显示在同一图形中?

这是我的代码,生成两个独立的数字:

import seaborn as sns
tips = sns.load_dataset("tips")

g = sns.catplot(
    x="sex", 
    y="total_bill", 
    hue="smoker", 
    row="time", 
    data=tips, 
    kind="bar", 
    ci = "sd", 
    edgecolor="black",
    errcolor="black",
    errwidth=1.5,
    capsize = 0.1,
    height=4, 
    aspect=.7,
)

g = sns.catplot(
    x="sex", 
    y="total_bill", 
    hue="smoker", 
    row="time", 
    data=tips, 
    kind="strip", 
    height=4, 
    aspect=.7,
)

输出:

问题:是否有办法使用Seborn将单个数据点与条形图一起显示在同一图形中?


解决方案

  • 图形级别绘图(seaborn.catplot)不能组合,但是可以将轴级绘图(seaborn.stripplot)映射到图形级别绘图。
    • 参见Building structured multi-plot grids
    • 这可能是一个变化无常的过程,并且可能仅在映射绘图中使用数据框中的相同列时才起作用。
  • 测试于python 3.8.11matplotlib 3.4.3seaborn 0.11.2
import seaborn as sns

tips = sns.load_dataset("tips")

g = sns.catplot(
    x="sex", 
    y="total_bill", 
    hue="smoker", 
    row="time", 
    data=tips, 
    kind="bar", 
    ci = "sd", 
    edgecolor="black",
    errcolor="black",
    errwidth=1.5,
    capsize = 0.1,
    height=4, 
    aspect=.7,
    alpha=0.5)

# map data to stripplot
g.map(sns.stripplot, 'sex', 'total_bill', 'smoker', hue_order=['Yes', 'No'], order=['Male', 'Female'],
      palette=sns.color_palette(), dodge=True, alpha=0.6, ec='k', linewidth=1)

相关文章