我想将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个位置-顶部中心、底部中心、右侧中心?
这实际上比你想象的要容易得多。这只是实际matplot输出中的默认设置。只需转到输出窗口顶部的配置子图按钮,并稍微降低您的右边框上限,它就会被修复。
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'