Matplotlib图例+ tight_layout =压扁的子图

时间:2018-05-14 08:22:42

标签: 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()

当我从bbox_to_anchor中删除plt.legend时,上面的代码会产生如下内容:

enter image description here

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

enter image description here

显然,这不是理想的。 bbox_to_anchortight_layout()之间似乎存在冲突(如果从上面的代码中删除,则会出现明智的结果)。有什么我做错了,或者这是已知/预期的行为?

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

1 个答案:

答案 0 :(得分:1)

预期结果虽然显然不可取。由于图例是下部子图的一部分,它将参与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()