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

Seaborn Boxplot图例颜色与绘图颜色不匹配问题求助

问题描述

使用Seaborn/Matplotlib绘制多分类数据的箱线图时,出现图例颜色与绘图颜色不匹配的问题。

实现代码

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame.from_dict(data)
print(data.head())
model_names = ['T5B', 'NatGen']
dfl = pd.melt(data, id_vars='metric', value_vars= ['T5B', 'NatGen'])
sns.boxplot(x= 'metric' , y='value', data=dfl, showfliers=False, color='tomato', hue='variable')
plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0, labels = model_names)
plt.show()

数据样例(执行print(df.head())输出)

metric variable     value
0  syntax      T5B  0.071429
1  syntax      T5B  0.086957
2  syntax      T5B  0.090909
3  syntax      T5B  0.071429
4  syntax      T5B  0.125000

解决方案

问题出在两个地方:一是手动指定color='tomato'覆盖了Seaborn基于hue自动分配的分类颜色;二是直接替换labels参数打乱了图例与绘图元素的对应关系。可以按以下方式修改:

方法一:修正颜色分配+通过数据统一图例名称

移除color参数,让Seaborn自动为不同hue类别分配颜色,同时直接修改数据中的variable列来统一图例名称(如果原数据的variable值已经和目标图例名一致,可跳过修改列的步骤):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame.from_dict(data)
model_names = ['T5B', 'NatGen']
dfl = pd.melt(data, id_vars='metric', value_vars= ['T5B', 'NatGen'])
# 统一variable列的名称(按需选择)
dfl['variable'] = dfl['variable'].map(dict(zip(['T5B', 'NatGen'], model_names)))
# 去掉color参数,保留hue让Seaborn自动分配颜色
sns.boxplot(x='metric', y='value', data=dfl, showfliers=False, hue='variable')
plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
plt.show()

方法二:直接修改图例标签(不改动原始数据)

先绘制图表,再获取图例的手柄对象,确保标签修改时颜色对应关系不被破坏:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = pd.DataFrame.from_dict(data)
model_names = ['T5B', 'NatGen']
dfl = pd.melt(data, id_vars='metric', value_vars= ['T5B', 'NatGen'])
# 去掉color参数,用hue区分类别
ax = sns.boxplot(x='metric', y='value', data=dfl, showfliers=False, hue='variable')
# 获取图例手柄和原有标签
handles, _ = ax.get_legend_handles_labels()
# 用新标签替换,同时保留手柄的颜色对应关系
ax.legend(handles=handles, labels=model_names, bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
plt.show()

自定义分类颜色(可选)

如果需要指定特定颜色,用palette参数替代color,为每个hue类别分配对应颜色:

custom_palette = {'T5B': 'tomato', 'NatGen': '#4682B4'}
sns.boxplot(x='metric', y='value', data=dfl, showfliers=False, hue='variable', palette=custom_palette)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:20