使用Seaborn displot自定义图例:调整位置及获取图例句柄与标签的方法
这个问题很常见——Seaborn的FacetGrid(也就是displot返回的对象)的图例管理逻辑和普通Matplotlib轴的图例不太一样,所以直接用plt.legend或者单个轴的方法会失效。这里有几个实用的解决方案:
方法1:绘图时直接指定图例参数(最简单)
在调用displot的时候,使用legend_kws参数把图例的位置设置直接传进去,这个参数会把字典里的键值对传递给Matplotlib的Legend对象,一步到位:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns df = pd.DataFrame({'1': np.random.normal(1, 1, 20), '2': np.random.normal(3, 1, 20)}) df = df.melt() # 直接在绘图时指定图例位置参数 g = sns.displot(df, x='value', hue='variable', kind='kde', legend_kws={'loc': 'lower left', 'bbox_to_anchor': (0, 1)}) plt.show()
方法2:修改已生成的FacetGrid图例
如果你已经绘制好了图,想要事后调整位置,FacetGrid的图例存储在g.legend属性里,直接修改它的位置参数即可:
g = sns.displot(df, x='value', hue='variable', kind='kde') # 调整图例的锚点和位置 g.legend.set_bbox_to_anchor((0, 1)) g.legend.set_loc('lower left') plt.show()
方法3:手动获取句柄和标签重新创建图例
如果需要做更复杂的图例定制,确实要拿到句柄和标签的话,因为这是单面板的FacetGrid,你可以从第一个轴(g.axes.flat[0])里获取,然后移除原图例再重新添加:
g = sns.displot(df, x='value', hue='variable', kind='kde') # 先移除原有的统一图例 g._legend.remove() # 从第一个子轴获取句柄和标签 handles, labels = g.axes.flat[0].get_legend_handles_labels() # 在目标位置添加新图例 g.axes.flat[0].legend(handles, labels, loc='lower left', bbox_to_anchor=(0, 1)) plt.show()
为什么之前的方法失效?
你用g.ax.get_legend_handles_labels()失败,是因为g.ax是FacetGrid的快捷方式,指向最后一个子轴;更关键的是,FacetGrid的图例是统一创建的,并不绑定在单个子轴的图例对象里,而是存放在g.legend属性中,所以直接调用单个轴的方法拿不到对应的句柄和标签。
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

