如何在seaborn swarmplot中为hue显示分组图例?
解决颜色分组与图例合并的方法
要实现y4值的颜色分组,让图例只显示分组名称而非单个y4值,有两种常用方案:
方法一:先给数据添加分组列(推荐)
直接在原始数据中新增一个分组字段,把需要归为一组的y4值映射到同一组名,再用这个分组字段作为hue参数:
- 先处理数据(根据你的y4实际取值调整分组规则):
import pandas as pd # 示例1:如果y4是数值型,按区间分组 result['y4_group'] = pd.cut( result['y4'], bins=[-float('inf'), 10, 20, float('inf')], # 自定义区间 labels=['低区间组', '中区间组', '高区间组'] ) # 示例2:如果y4是分类型,按指定类别合并 # result['y4_group'] = result['y4'].map({ # '类别1': '甲组', # '类别2': '甲组', # '类别3': '乙组', # '类别4': '乙组' # })
- 修改绘图代码,用新的分组字段作为
hue:
import seaborn as sns import matplotlib.pyplot as plt ax1 = sns.swarmplot( x='y', y='Fos', data=result, hue="y4_group", # 这里用分组字段 palette="Spectral", alpha=0.8 ) plt.title('Y4') # 调整图例位置到图外 sns.move_legend(ax1, "upper left", bbox_to_anchor=(1, 1)) plt.show()
方法二:自定义调色盘+手动修改图例(无需修改原始数据)
如果不想改动原始数据,可以给同一组的y4值分配相同颜色,再手动合并图例项:
import seaborn as sns import matplotlib.pyplot as plt # 定义y4值到分组和颜色的映射,按你的需求调整 group_color_map = { 'y4值1': ('甲组', '#ff7f0e'), 'y4值2': ('甲组', '#ff7f0e'), 'y4值3': ('乙组', '#1f77b4'), 'y4值4': ('乙组', '#1f77b4') } # 提取每个y4值对应的颜色 palette = {k: v[1] for k, v in group_color_map.items()} # 绘制 swarmplot ax1 = sns.swarmplot( x='y', y='Fos', data=result, hue="y4", palette=palette, alpha=0.8 ) plt.title('Y4') # 合并相同分组的图例项 handles, labels = ax1.get_legend_handles_labels() unique_groups = {} for label, handle in zip(labels, handles): group_name = group_color_map[label][0] if group_name not in unique_groups: unique_groups[group_name] = handle # 更新图例 ax1.legend( handles=list(unique_groups.values()), labels=list(unique_groups.keys()), loc="upper left", bbox_to_anchor=(1, 1) ) plt.show()
内容的提问来源于stack exchange,提问作者Luca Piciullo
相关产品推荐
相关产品推荐

