Matplotlib 图例 +ight_layout = 压扁的子图

MPA*_*MPA 4 python matplotlib

考虑以下示例:

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()
Run Code Online (Sandbox Code Playgroud)

当我删除bbox_to_anchorfrom时plt.legend,上面的代码应该生成如下内容:

在此输入图像描述

但是,当我使用(如上面的代码中所示)将图例放置在子图之外时bbox_to_anchor,子图会被压扁:

在此输入图像描述

显然,这是不希望的。bbox_to_anchor和之间似乎存在冲突tight_layout()(如果您从上面的代码中删除其中任何一个,就会出现一些合理的结果)。我做错了什么,还是这是已知/预期的行为?

这个问题在各种后端下都会重现。我没有收到任何警告或错误。我正在使用 matplotlib 版本2.2.2

Imp*_*est 7

结果是预料之中的,尽管显然并不理想。由于图例是下部子图的一部分,因此它将参与该tight_layout机制,从而将所有内容移至顶部。

你可以tight_layout先打电话,

plt.tight_layout()
plt.legend(loc="upper center", bbox_to_anchor=(0.5, 2.3))
Run Code Online (Sandbox Code Playgroud)

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

您还可以创建人物图例,

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