python - 如何使用tight_layout 保持轴纵横比
问题描述
我有一个带有颜色条和图例的情节。我想将图例放在颜色栏右侧的情节之外。为此,我使用 bbox_to_anchor 参数,但这会导致图例被截断:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
_, ax = plt.subplots()
extent = np.r_[0, 1, 0, 1]
space = np.linspace(0, 1)
probs = np.array([[norm.cdf(x + y) for x in space] for y in space])
colormap = ax.imshow(probs, aspect="auto", origin="lower", extent=extent, alpha=0.5)
colorbar = plt.colorbar(colormap, ax=ax)
colorbar.set_label(f"Probability")
ax.scatter(
[0.2, 0.4, 0.6], [0.8, 0.6, 0.4], color="r", label="Labeled Points",
)
plt.legend(loc="center left", bbox_to_anchor=(1.3, 0.5))
plt.title
plt.show()
图例被切断的情节
为了修复图例,我在 plt.show() 之前插入了对 plt.tight_layout() 的调用,但这会导致纵横比失真:
用扭曲的纵横比绘图
如何显示整个图例并保留轴的纵横比?
解决方案
您可以使用 管理轴高度和宽度之间的比率matplotlib.axes.Axes.set_aspect
。由于您希望它们相等:
ax.set_aspect(1)
然后,您可以使用matplotlib.pyplot.tight_layout
将图例拟合到图中。
如果你也想调整边距,你可以使用matplotlib.pyplot.subplots_adjust
.
完整代码
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
_, ax = plt.subplots()
extent = np.r_[0, 1, 0, 1]
space = np.linspace(0, 1)
probs = np.array([[norm.cdf(x + y) for x in space] for y in space])
colormap = ax.imshow(probs, aspect="auto", origin="lower", extent=extent, alpha=0.5)
colorbar = plt.colorbar(colormap, ax=ax)
colorbar.set_label(f"Probability")
ax.scatter([0.2, 0.4, 0.6], [0.8, 0.6, 0.4], color="r", label="Labeled Points",)
plt.legend(loc="center left", bbox_to_anchor=(1.3, 0.5))
ax.set_aspect(1)
plt.tight_layout()
plt.subplots_adjust(left = 0.1)
plt.show()
推荐阅读
- node.js - 现在任何人如何将 qr-code 转换为文件 png 格式节点
- javascript - 在 Javascript 中引用 lambda 函数中的常量值,然后使用 chrome.scripting.executeScript
- typescript - 错误 TS6133: 'functions' 被声明但它的值从未被读取
- r - “ggridges”图中的多个变量
- google-chrome-headless - 具有文件权限的无头 Chrome 屏幕截图
- python - 使用 geojson 字符串填充 Spatialite 数据库
- python - 我想要另一个版本包(Python)
- android - ionic agular 项目我的构建失败...错误
- python - 使用 Selenium 进行 Web 抓取尝试会产生重复的条目
- r - 使用 macOS Big Sur 安装“TropFishR”包时出现错误