Matplotlib图例+ tight_layout = 压缩的子图

3
考虑以下示例:
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np

x = np.linspace(0, 10, 100)
y = 2*x + 0.5

plt.figure(figsize=(6, 4))
gs = gridspec.GridSpec(2, 2)

plt.subplot(gs[0, 0])
plt.plot(x, y, "o")

plt.subplot(gs[0, 1])
plt.plot(x, y, "o")

plt.subplot(gs[1, :])
plt.plot(x, y, "o", label="test")
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 2.7))

plt.subplot(gs[2, :])
plt.plot(x, y, "o")

plt.tight_layout()
plt.show()

当我从plt.legend中删除bbox_to_anchor时,上述代码应该生成类似于这样的结果:

enter image description here

但是,当我使用bbox_to_anchor将图例放在子图之外时(就像上面的代码中一样),子图被压缩了:

enter image description here

显然,这不是我们想要的。似乎bbox_to_anchortight_layout()之间存在冲突(如果您从上面的代码中删除其中一个,就会得到一些合理的结果)。我做错了什么吗,还是这是已知/预期的行为?
这个问题在各种后端下都可以复现。我没有收到任何警告或错误。我正在使用matplotlib版本2.2.2

1
数字2.7的目的是什么?您希望将图例放在哪里? - ImportanceOfBeingErnest
@ImportanceOfBeingErnest 数字2.7应将图例定位在底部子图上方(大约在图形顶部附近)。该值是我在创建出现问题的图时与subplots_adjust相结合的遗留物。在这个最简化的示例中,我还没有测试一个良好布局的正确值应该是多少(可以是2.3或其他),但不同的值给出相同的结果(即压缩子图)。 - MPA
1个回答

6

预期的结果虽然显然是不可取的。由于图例是较低子图的一部分,因此它将参与 tight_layout 机制,并将所有内容向上移动。

您可以先调用 tight_layout

plt.tight_layout()
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 2.3))

为了获得紧密的间距,然后创建图例。

您也可以创建一个图例。

fig = plt.figure(figsize=(6, 4))
# ...
fig.legend(loc="upper center", bbox_to_anchor=(0.5, .9))
plt.tight_layout()

1
首先调用 tight_layout 真是太好了,谢谢 Ernest。 - MPA

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