You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Seaborn的catplot小提琴图上叠加swarmplot并保存图片?

将Swarmplot叠加到Catplot(Violin图)并保存的方法

方法一:使用FacetGrid的map()方法

sns.catplot()返回的是FacetGrid对象,利用它的map()方法可以在所有子图上统一叠加swarmplot,适配单图或多子图场景:

import seaborn as sns
import matplotlib.pyplot as plt

# 替换为你的数据集
df = sns.load_dataset("titanic")

# 创建violin图的FacetGrid
grid = sns.catplot(
    data=df, 
    x="age", 
    y="class", 
    kind="violin", 
    color=".9", 
    inner=None
)

# 叠加swarmplot到每个子图
grid.map(
    sns.swarmplot, 
    "age", "class",  # 对应数据列名
    size=3,          # 调整点的大小
    color="black",   # 用深色区分violin图
    order=["First", "Second", "Third"]  # 保持和violin图的类别顺序一致
)

# 保存到文件
grid.savefig("violin_swarm_combined.jpg")

方法二:手动获取轴并绘制

如果仅需在单个子图上叠加,可以直接提取FacetGrid的轴对象,传给swarmplot的ax参数:

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset("titanic")

grid = sns.catplot(
    data=df, 
    x="age", 
    y="class", 
    kind="violin", 
    color=".9", 
    inner=None
)

# 获取FacetGrid的单个轴(多子图时需遍历axes数组)
ax = grid.axes[0, 0]

# 在指定轴上绘制swarmplot
sns.swarmplot(
    data=df, 
    x="age", 
    y="class", 
    size=3, 
    color="black", 
    ax=ax
)

grid.savefig("violin_swarm_single.jpg")

关键注意事项

  • 确保swarmplot的类别顺序(order参数)和violin图一致,避免错位
  • 选择对比明显的颜色,让两个图层都清晰可见
  • 若使用col/row参数创建多子图,map()方法会自动在所有子图上叠加,无需手动遍历轴

内容的提问来源于stack exchange,提问作者boondocks5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:09:25