Seaborn histplot子图中自定义图例

3

我想生成一个包含4个子图的图表,每个子图都是Seaborn histplot。图表定义行如下:

fig,axes=plt.subplots(2,2,figsize=(6.3,7),sharex=True,sharey=True)
(ax1,ax2),(ax3,ax4)=axes
fig.subplots_adjust(wspace=0.1,hspace=0.2)

我希望为每个子图中的图例条目定义字符串。 例如,对于第一个子图,我正在使用以下代码:

sp1=sns.histplot(df_dn,x="ktau",hue="statind",element="step", stat="density",common_norm=True,fill=False,palette=colvec,ax=ax1)
ax1.set_title(r'$d_n$')
ax1.set_xlabel(r'max($F_{a,max}$)')
ax1.set_ylabel(r'$\tau_{ken}$')
legend_labels,_=ax1.get_legend_handles_labels()
ax1.legend(legend_labels,['dep-','ind-','ind+','dep+'],title='Stat.ind.')

图例显示不正确(图例条目未绘制,图例标题是色调变量“statind”的名称)。请注意,我已成功地使用了相同的代码来生成其他图表,其中我使用Seaborn relplots而不是histplots。

1个回答

12

主要问题在于ax1.get_legend_handles_labels()返回空列表(请注意,第一个返回值是handles,第二个是labels)。至少对于当前(0.11.1)版本的seaborn的histplot()

要获取handles,可以使用legend = ax1.get_legend(); handles = legend.legendHandles

为了重新创建图例,首先需要删除现有的图例。然后,可以从某些handles开始创建新的图例。

还要注意,为了确保标签的顺序,可以设置hue_order。以下是一些示例代码以展示这些想法:

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

df_dn = pd.DataFrame({'ktau': np.random.randn(4000).cumsum(),
                      'statind': np.repeat([*'abcd'], 1000)})

fig, ax1 = plt.subplots()
sp1 = sns.histplot(df_dn, x="ktau", hue="statind", hue_order=['a', 'b', 'c', 'd'],
                   element="step", stat="density", common_norm=True, fill=False, ax=ax1)
ax1.set_title(r'$d_n$')
ax1.set_xlabel(r'max($F_{a,max}$)')
ax1.set_ylabel(r'$\tau_{ken}$')
legend = ax1.get_legend()
handles = legend.legendHandles
legend.remove()
ax1.legend(handles, ['dep-', 'ind-', 'ind+', 'dep+'], title='Stat.ind.')
plt.show()

示例图


1
legendHandles属性在Matplotlib 3.7中已被弃用,并将在两个次要版本后被移除。请改用legend_handles - undefined
你知道为什么使用sns.histplot时,.get_legend_handles_labels()方法无法正常工作吗?不查看源代码,凭直觉你能回答吗? - undefined
1
get_legend_handles_labels只在将标签分配给matplotlib元素时才起作用。所以,很可能seaborn在某些情况下没有分配标签给元素。这可能会有些棘手,因为元素取决于参数(例如element=),有时会创建多个matplotlib元素来可视化一个seaborn元素。通常你不希望所有这些元素都出现在图例中。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接