首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Seaborn配对图图例-如何控制位置

Seaborn配对图图例-如何控制位置
EN

Stack Overflow用户
提问于 2016-06-14 23:06:34
回答 3查看 19.8K关注 0票数 12

我想将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个图例都打印不正确。我不确定它是否在做我要求的定位。我不确定右边发生了什么--似乎出现了两个垂直的图例,由于某种原因,它们完全重叠在一起。两个水平图例中的一个根本没有出现。

有没有一种方法可以避免垂直图例重叠,同时将图例放在绘图之外的3个位置-顶部中心、底部中心、右侧中心?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-01 19:57:47

pairplot已在绘图矩阵外部添加了图例,但不清楚要将其移动到何处。其他图例可能会按照您的要求进行定位,即使这可能不是您真正想要的。

plt.legend会将一个图例附加到当前轴,并且每个轴只能有一个图例,因此在您的代码中只绘制最后一个图例。但是您可以将多个图例附加到一个图形和IIUC,您希望相对于图形定位图例,因此图形图例似乎是最好的选择。

为了绘制图形图例,您需要显式地传递处理程序和标签。为此,我必须使用私有属性PairPlot._legend_data,我没有找到使用公共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)

操作人员在评论中询问是否可以在海运文件中找到这一点。当然,这只是纯matplotlib的一部分,并不特定于seaborn。但我也意识到,我必须依赖于一些未记录在案的功能。

PairGrid具有引用Figure实例的fig属性这一事实没有文档记录。无论如何,这是一个简单的猜测,我可以使用fig = plt.gcf()来代替。

获取图例的标签和句柄比较棘手。我通过查看PairGrid.add_legend的文档字符串了解了_legend_data属性,但是文档字符串本身有一点隐藏(它不会出现在web中),并且该属性被下划线标记,就好像它是私有的一样,所以使用它感觉很不舒服。我发现在公共方法的文档字符串中提到私有属性是不一致的,也许我们应该将legend_data作为公共属性,但我离题了。

或者,您可以尝试从子图中提取标签和句柄。你可能会猜到这些小情节有这些信息,但没有实际的保证,所以这意味着依赖于未记录的行为。事实证明,非对角线的子图有它(但对角线的子图没有,所以如果你只看第一个子图,你会被误导),你可以做handles, labels = fig.get_axes()[1].get_legend_handles_labels()。但正如我所说的,这是未记录的行为,即使您只使用有记录的API。

你也可以创建自己的句柄,但这会很麻烦,这就是为什么我会寻找捷径,即使没有文档。

票数 20
EN

Stack Overflow用户

发布于 2019-06-19 08:55:28

要控制默认配对图例的位置:

    g._legend.set_bbox_to_anchor((0.5, 0.5))
票数 14
EN

Stack Overflow用户

发布于 2016-12-01 06:46:04

这实际上比你想象的要容易得多。这只是实际matplot输出中的默认设置。只需转到输出窗口顶部的配置子图按钮,并稍微降低您的右边框上限,它就会被修复。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37815774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档