Seaborn pairplot legend - 如何控制位置
Seaborn pairplot legend - how to control position
我想将 Seaborn 配对图图例移到散点图矩阵之外。官方docs不给关键词legend
。我正在尝试同时在 3 个不同位置绘制图外的图例:底部中心、顶部中心、右中心
我试过这个:
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
g = sns.pairplot(iris,hue='species', palette='husl', markers='d', size=2.5, plot_kws=
{
"s":40,
"alpha":1.0,
'lw':0.5,
'edgecolor':'k'
})
plt.legend(loc='upper center', bbox_to_anchor=(1.10, 1.0), ncol=1) #vertical legend
plt.legend(loc='lower center', bbox_to_anchor=(0.0, -0.15), ncol=3) #horizontal legend bottom
plt.legend(loc='upper left', bbox_to_anchor=(0.0, 1.15), ncol=3) #horizontal legend top
g.savefig('Test.png', bbox_inches='tight')
以上代码的输出是这个文件:.
所有 3 个图例都打印不正确。我不确定它是否按照我的要求进行定位。我不确定右边发生了什么——似乎出现了 2 个垂直图例,并且由于某种原因它们完全相互重叠。两个水平图例之一根本没有出现。
有没有办法避免垂直图例重叠,并将图例放在图外的 3 个位置 - 顶部中心、底部中心、右侧中心?
这实际上比您想象的要容易得多。它只是实际 matplot 输出中的默认设置。只需转到输出 window 顶部的配置子图按钮,然后稍微降低右边框上限,它就会被修复。
pairplot
已经在绘图矩阵外添加了一个图例,不清楚您要将其移动到哪里。其他图例可能按照您的要求放置,即使这可能不是您真正想要的。
plt.legend
会将图例附加到当前轴,每个轴只能有一个图例,因此在您的代码中只绘制最后一个图例。但是您可以将多个图例附加到一个图形上,而 IIUC 您想相对于图形定位图例,因此图形图例似乎是最好的选择。
为了绘制图形图例,您需要明确传递处理程序和标签。为此,我不得不使用私有属性 PairPlot._legend_data
,我没有找到使用 public API.
的方法
不幸的是,matplotlib 不会自动腾出空间来容纳这些图例,除非您进行一些调整,否则它们将与子图重叠。在这种情况下,我将只使用 subplot_adjust
和一些对我有用的硬编码值,因为计算很棘手。
所以这是希望能完成您想要的操作的代码:
g = sns.pairplot(iris, hue='species', palette='husl', markers='d', size=2.5, plot_kws=
{
"s":40,
"alpha":1.0,
'lw':0.5,
'edgecolor':'k'
})
handles = g._legend_data.values()
labels = g._legend_data.keys()
g.fig.legend(handles=handles, labels=labels, loc='upper center', ncol=1)
g.fig.legend(handles=handles, labels=labels, loc='lower center', ncol=3)
g.fig.legend(handles=handles, labels=labels, loc='upper left', ncol=3)
g.fig.subplots_adjust(top=0.92, bottom=0.08)
OP 在评论中询问是否可以在 seaborn 文档中找到它。当然,其中一部分只是纯粹的 matplotlib,并非特定于 seaborn。但我也意识到我必须依赖一些未记录的功能。
PairGrid
具有引用 Figure
实例的 fig
属性这一事实未记录在案。无论如何,这是一个简单的猜测,我本可以使用 fig = plt.gcf()
代替。
获取图例的标签和句柄比较棘手。我通过查看PairGrid.add_legend
的文档字符串了解了_legend_data
属性,但是文档字符串本身有点隐藏(它没有出现在网络中)并且该属性带有下划线,就好像它是私有的一样,所以使用起来感觉不舒服。我发现在 public 方法的文档字符串中提到私有属性是不一致的,可能我们应该将 legend_data
作为 public 属性,但我离题了。
或者,您可以尝试从子图中提取标签和句柄。您可能猜到子图有此信息,但没有实际保证,因此这意味着依赖未记录的行为。事实证明,非对角线子图有它(但对角线子图没有,所以如果你只看第一个子图,你会被误导)并且你可以做 handles, labels = fig.get_axes()[1].get_legend_handles_labels()
。但正如我所说,即使您仅使用已记录的 API.
,这也是未记录的行为
您也可以创建自己的句柄,但这会很麻烦,这就是我寻找快捷方式的原因,即使没有记录。
控制默认pairplot图例的位置:
g._legend.set_bbox_to_anchor((0.5, 0.5))
这对我有帮助,它删除了默认图例,并且这里有很多设置。
g = sns.pairplot(data, hue="Group")
sns.move_legend(g, "lower center",bbox_to_anchor=(0.5, -0.035), labels=labels, ncol=5, title='Group', frameon=False,)
我想将 Seaborn 配对图图例移到散点图矩阵之外。官方docs不给关键词legend
。我正在尝试同时在 3 个不同位置绘制图外的图例:底部中心、顶部中心、右中心
我试过这个:
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
g = sns.pairplot(iris,hue='species', palette='husl', markers='d', size=2.5, plot_kws=
{
"s":40,
"alpha":1.0,
'lw':0.5,
'edgecolor':'k'
})
plt.legend(loc='upper center', bbox_to_anchor=(1.10, 1.0), ncol=1) #vertical legend
plt.legend(loc='lower center', bbox_to_anchor=(0.0, -0.15), ncol=3) #horizontal legend bottom
plt.legend(loc='upper left', bbox_to_anchor=(0.0, 1.15), ncol=3) #horizontal legend top
g.savefig('Test.png', bbox_inches='tight')
以上代码的输出是这个文件:
所有 3 个图例都打印不正确。我不确定它是否按照我的要求进行定位。我不确定右边发生了什么——似乎出现了 2 个垂直图例,并且由于某种原因它们完全相互重叠。两个水平图例之一根本没有出现。
有没有办法避免垂直图例重叠,并将图例放在图外的 3 个位置 - 顶部中心、底部中心、右侧中心?
这实际上比您想象的要容易得多。它只是实际 matplot 输出中的默认设置。只需转到输出 window 顶部的配置子图按钮,然后稍微降低右边框上限,它就会被修复。
pairplot
已经在绘图矩阵外添加了一个图例,不清楚您要将其移动到哪里。其他图例可能按照您的要求放置,即使这可能不是您真正想要的。
plt.legend
会将图例附加到当前轴,每个轴只能有一个图例,因此在您的代码中只绘制最后一个图例。但是您可以将多个图例附加到一个图形上,而 IIUC 您想相对于图形定位图例,因此图形图例似乎是最好的选择。
为了绘制图形图例,您需要明确传递处理程序和标签。为此,我不得不使用私有属性 PairPlot._legend_data
,我没有找到使用 public API.
不幸的是,matplotlib 不会自动腾出空间来容纳这些图例,除非您进行一些调整,否则它们将与子图重叠。在这种情况下,我将只使用 subplot_adjust
和一些对我有用的硬编码值,因为计算很棘手。
所以这是希望能完成您想要的操作的代码:
g = sns.pairplot(iris, hue='species', palette='husl', markers='d', size=2.5, plot_kws=
{
"s":40,
"alpha":1.0,
'lw':0.5,
'edgecolor':'k'
})
handles = g._legend_data.values()
labels = g._legend_data.keys()
g.fig.legend(handles=handles, labels=labels, loc='upper center', ncol=1)
g.fig.legend(handles=handles, labels=labels, loc='lower center', ncol=3)
g.fig.legend(handles=handles, labels=labels, loc='upper left', ncol=3)
g.fig.subplots_adjust(top=0.92, bottom=0.08)
OP 在评论中询问是否可以在 seaborn 文档中找到它。当然,其中一部分只是纯粹的 matplotlib,并非特定于 seaborn。但我也意识到我必须依赖一些未记录的功能。
PairGrid
具有引用 Figure
实例的 fig
属性这一事实未记录在案。无论如何,这是一个简单的猜测,我本可以使用 fig = plt.gcf()
代替。
获取图例的标签和句柄比较棘手。我通过查看PairGrid.add_legend
的文档字符串了解了_legend_data
属性,但是文档字符串本身有点隐藏(它没有出现在网络中)并且该属性带有下划线,就好像它是私有的一样,所以使用起来感觉不舒服。我发现在 public 方法的文档字符串中提到私有属性是不一致的,可能我们应该将 legend_data
作为 public 属性,但我离题了。
或者,您可以尝试从子图中提取标签和句柄。您可能猜到子图有此信息,但没有实际保证,因此这意味着依赖未记录的行为。事实证明,非对角线子图有它(但对角线子图没有,所以如果你只看第一个子图,你会被误导)并且你可以做 handles, labels = fig.get_axes()[1].get_legend_handles_labels()
。但正如我所说,即使您仅使用已记录的 API.
您也可以创建自己的句柄,但这会很麻烦,这就是我寻找快捷方式的原因,即使没有记录。
控制默认pairplot图例的位置:
g._legend.set_bbox_to_anchor((0.5, 0.5))
这对我有帮助,它删除了默认图例,并且这里有很多设置。
g = sns.pairplot(data, hue="Group")
sns.move_legend(g, "lower center",bbox_to_anchor=(0.5, -0.035), labels=labels, ncol=5, title='Group', frameon=False,)