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
,上面的代码应该产生如下内容:
但是,当我使用(如上面的代码)将图例放在子图之外时,子bbox_to_anchor
图会被压扁:
显然,这是不希望的。bbox_to_anchor
和之间似乎存在冲突tight_layout()
(如果您从上面的代码中删除任何一个,就会出现一些明智的情况)。我做错了什么,还是这是已知/预期的行为?
这个问题在各种后端下重现。我没有收到任何警告或错误。我正在使用 matplotlib 版本2.2.2
。
解决方案
结果是意料之中的,尽管显然是不可取的。由于图例是下部子图的一部分,因此它将参与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()
推荐阅读
- isabelle - 当证明开始时,我们如何强制 Isabelle 向我们揭示它在 Isar 的后台应用了什么规则?
- python - 是否可以一次或并行安装多个包,而不是在 python 中一个一个安装?
- javascript - 在javascript中读取部分二进制文件而不将整个文件加载到内存中
- django - 在 Django 2.2 中一起使用 Postgres `unnest` 和 `substr`
- file - 搜索和替换后 EmEditor 命令行保存文件的问题
- python - pygame.time.delay() 比 time.sleep() 好吗?
- makefile - 一个先决条件中的目标数量未知?
- ios - ReplayKit2 - 直接从应用程序开始广播
- sql - 如何在 SQL/PostgreSQL 中的两列中获取 MAX 值
- mysql - 快速会话和 MySQL