Seaborn Histplot设置图例位置时图例消失,仅显示空方块,如何解决?
Seaborn直方图移动图例位置的正确方法
问题背景
构造用于复现问题的DataFrame:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt numbers = pd.Series(np.random.choice(10,50), name='numbers') colors=pd.Series(np.random.choice(['A','B'],50), name='colors') df = pd.concat([numbers, colors], axis=1)
使用Seaborn绘制带hue区分的直方图时,默认图例显示正常:
sns.histplot(data=df, x='numbers', hue='colors') plt.show()
但直接调用plt.legend(loc="upper left")移动图例位置时,指定位置仅显示空方块,原图例消失。
问题原因
Seaborn的histplot会基于hue参数自行生成包含对应标签和颜色映射的图例,直接调用plt.legend()会覆盖这个自动生成的图例,且无法正确获取原有的图例元素,因此出现空方块。
解决方法
方法1:通过轴对象修改图例位置
先获取绘图返回的轴对象,直接调用轴的legend方法指定位置,或者修改已有图例的位置属性:
# 方式1:调用轴的legend方法 ax = sns.histplot(data=df, x='numbers', hue='colors') ax.legend(loc="upper left") plt.show() # 方式2:修改现有图例的位置属性 ax = sns.histplot(data=df, x='numbers', hue='colors') ax.get_legend().set_loc("upper left") plt.show()
方法2:手动传入图例元素给plt.legend
先从轴对象中提取Seaborn生成的图例手柄和标签,再传给plt.legend指定位置:
ax = sns.histplot(data=df, x='numbers', hue='colors') handles, labels = ax.get_legend_handles_labels() plt.legend(handles=handles, labels=labels, loc="upper left") plt.show()
内容的提问来源于stack exchange,提问作者Gato Marbré
相关产品推荐
相关产品推荐

