繁体   English   中英

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

[英]How to set same aspect ratio for subplots in matplotlib

我想要一排具有相同纵横比的子图。 假设我想要 plot 两个在 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]

由 Mathematica 制作

简短回答:制作子图时使用 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)为每个 plot 设置 y 轴与 x 轴的比率。

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

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)

这就是为什么你的地块形状不同的原因; 轴限制不同,但您已将两个图上的形状大小设置为相同

在此处输入图像描述

这个问题并不完全清楚期望的结果是什么。 可能您希望在不更改轴的情况下拥有固定的数据方面?

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, adjustable="datalim")
ax[1].set_aspect(.5, adjustable="datalim")
plt.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM