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

如何将两个不同形状的DataFrame绘制为并排violinplot并添加swarmplot

解决双DataFrame小提琴图重叠并添加散点的问题

问题描述

现有两个结构不同(各模型样本量不一致)的DataFrame,当前绘制的小提琴图出现重叠,需要将对应模型的蓝色、红色小提琴图分别并排展示,同时用swarmplot呈现数据点。

解决方案

核心思路是将两个数据集重构为长格式(Long Format),添加分组标记后合并,利用Seaborn的hue和dodge参数实现并排效果,无需手动填充NaN(Seaborn可自动处理非等长数据)。

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # 补充导入Seaborn

# 构建原始数据
data1 = {
    'DT': np.random.normal(-1, 1, 100),
    'RF': np.random.normal(-1, 1, 110),
    'KNN': np.random.normal(-1, 1, 120)
}

data2 = {
    'DT': np.random.normal(-1, 1, 50),
    'RF': np.random.normal(-1, 1, 60),
    'KNN': np.random.normal(-1, 1, 80)
}

# 转换为长格式并添加分组标记
df1_long = pd.melt(pd.DataFrame(data1), var_name='模型', value_name='得分')
df1_long['数据集'] = '数据集1'

df2_long = pd.melt(pd.DataFrame(data2), var_name='模型', value_name='得分')
df2_long['数据集'] = '数据集2'

# 合并两个数据集
combined_df = pd.concat([df1_long, df2_long], ignore_index=True)

# 绘图
fig, ax = plt.subplots(figsize=(15, 6))

# 绘制小提琴图:dodge=True实现同模型下两个小提琴并排
sns.violinplot(
    data=combined_df,
    x='模型',
    y='得分',
    hue='数据集',
    palette={'数据集1': 'blue', '数据集2': 'red'},
    dodge=True,
    ax=ax
)

# 添加Swarm散点图:dodge=True让散点与小提琴位置对应
sns.swarmplot(
    data=combined_df,
    x='模型',
    y='得分',
    hue='数据集',
    palette={'数据集1': 'darkblue', '数据集2': 'darkred'},
    dodge=True,
    ax=ax,
    size=3  # 调整散点大小避免拥挤
)

# 优化图例:移除重复项
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[:2], labels[:2], title='数据集')

plt.show()

关键说明

  1. 长格式转换:用pd.melt将宽格式数据转为长格式,方便Seaborn识别分组和类别。
  2. 并排实现:violinplot和swarmplot的dodge=True参数,会让同一x轴类别下的不同hue元素自动并排,避免重叠。
  3. 数据处理简化:无需手动填充NaN,Seaborn会自动忽略缺失值,直接处理非等长的模型数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:10:25