如何在matplotlib中为子图设置相同的纵横比

2023-12-31

我想要一排具有相同纵横比的子图。假设我想绘制两个在 y 轴上具有不同范围的不同函数。

这方面似乎有很多问题,但示例似乎很方便地对所有子图具有相同的轴。无论如何,我发现没有一个对我有帮助。

我尝试过以下方法

import numpy as np
import matplotlib.pyplot as plt

xdata = np.arange(0,2,.01)
ydata1 = xdata
ydata2 = xdata ** 2

fig, ax = plt.subplots(1,2)

ax[0].plot(xdata,ydata1)
ax[1].plot(xdata,ydata2)

ax[0].set_aspect(.5)
ax[1].set_aspect(.5)
plt.show(fig)

然而,matplotlib 似乎使用 x 和 y 轴数据来确定纵横比,并且由于 y 轴具有不同的范围,子图的结果也不同。这对我来说太奇怪了。如何使它们具有相同的物理长宽比?

我想人们可以尝试提取每个子图的限制并单独计算正确的纵横比,但这似乎是一种非常迂回的方式,我希望内置这样一个基本功能,使所有子图看起来都相同。

编辑所以我想要的是两个子图在人类意义上具有相同的纵横比,也就是说两个子图的宽度与高度的比率是相同的。例如,在 Mathematica 中,我可以通过简单地设置来实现这一点AspectRatio属性:

xdata = Range[0, 2, .01];
ydata1 = {#, #} & /@ xdata;
ydata2 = {#, #^2} & /@ xdata;
fig = GraphicsRow[
   ListLinePlot[#, AspectRatio -> 1/GoldenRatio, Frame -> True, 
      ImageSize -> 300] & /@ {ydata1, ydata2}];
Export["fig.png", fig]

简短回答:制作子图时使用 Figsize 关键字参数:

import numpy as np
import matplotlib.pyplot as plt

xdata = np.arange(0,2,.01)
ydata1 = xdata
ydata2 = xdata ** 2

fig = plt.figure(figsize=(10,6))
ax = fig.subplots(1,2)

ax[0].plot(xdata,ydata1)
ax[1].plot(xdata,ydata2)

# Squares
ax[0].plot([0,1,1,0],[0,0,1,1])
ax[1].plot([0,1,1,0],[0,0,1,1])

plt.show(fig)

figsize是一个以英寸为单位的元组,第一个元素作为 x 方向的宽度,第二个元素作为 y 方向的宽度。

适用于整个人物;您需要调整它以获得适合您的子图的形状。

更长的答案: .set_aspect(num)设置每个图的 y 轴与 x 轴比率。

所以,当你使用.set_aspect(.5)在每个轴上,你告诉matplotlib重新配置每个轴,使 y 轴是 x 轴的 0.5 倍。这意味着 1x1 的正方形实际上在每个图上看起来都像一个矩形:

import numpy as np
import matplotlib.pyplot as plt

xdata = np.arange(0,2,.01)
ydata1 = xdata
ydata2 = xdata ** 2

fig, ax = plt.subplots(1,2)

ax[0].plot(xdata,ydata1)
ax[1].plot(xdata,ydata2)

# Squares
ax[0].plot([0,1,1,0],[0,0,1,1])
ax[1].plot([0,1,1,0],[0,0,1,1])

ax[0].set_aspect(.5)
ax[1].set_aspect(.5)
plt.show(fig)

这就是为什么你的情节有不同的形状;轴限制是不同的,但您已将两个图上的形状大小设置为the same.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在matplotlib中为子图设置相同的纵横比 的相关文章

随机推荐