如何将两个不同形状的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()
关键说明
- 长格式转换:用
pd.melt将宽格式数据转为长格式,方便Seaborn识别分组和类别。 - 并排实现:
violinplot和swarmplot的dodge=True参数,会让同一x轴类别下的不同hue元素自动并排,避免重叠。 - 数据处理简化:无需手动填充NaN,Seaborn会自动忽略缺失值,直接处理非等长的模型数据。
内容的提问来源于stack exchange,提问作者rk___
相关产品推荐
相关产品推荐

