ede*_*esz 4 python matplotlib python-2.7 seaborn
我想在散点图矩阵之外移动Seaborn配对图例.官方文档没有提供关键字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')
Run Code Online (Sandbox Code Playgroud)
所有3个图例都打印错误.我不确定它是否正在进行我要求的定位.我不确定右边发生了什么 - 似乎出现了2个垂直传说,并且出于某种原因它们完全相互重叠.两个水平传说中的一个根本没有出现.
有没有办法避免重叠垂直图例,并将图例放在图中3个位置 - 顶部中心,底部中心,右侧中心?
小智 13
要控制默认配对图图例的位置:
g._legend.set_bbox_to_anchor((0.5, 0.5))
Run Code Online (Sandbox Code Playgroud)
Sto*_*ica 12
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)
Run Code Online (Sandbox Code Playgroud)
OP在评论中询问是否可以在seaborn文档中找到它.当然,这部分只是纯粹的matplotlib,不是特定于seaborn.但我也意识到我不得不依赖一些无证的功能.
没有记录PairGrid
具有fig
引用该Figure
实例的属性的事实.无论如何这是一个简单的猜测,我本可以使用fig = plt.gcf()
.
获取图例的标签和句柄比较棘手.我_legend_data
通过查看文档字符串来了解该属性PairGrid.add_legend
,但文档字符串本身有点隐藏(它没有出现在Web中),并且该属性被强调为私有,因此使用它会感觉不舒服.我发现在公共方法的docstring中提到私有属性是不一致的,可能我们应该将其legend_data
作为公共属性,但我离题了.
或者,您可以尝试从子图中提取标签和句柄.您可以猜测子图有这些信息,但没有实际保证,因此这意味着依赖于未记录的行为.事实证明,非对角线的子图有它(但是对角的子图没有,所以如果你只是看了第一个子图,你会被误导),你可以做到handles, labels = fig.get_axes()[1].get_legend_handles_labels()
.但正如我所说,即使您只使用文档化的API,这也是未记录的行为.
您也可以创建自己的句柄,但这很麻烦,这就是为什么我寻找快捷方式,即使没有文档.
归档时间: |
|
查看次数: |
9469 次 |
最近记录: |