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
相关产品推荐
相关产品推荐

