如何在Matplotlib中创建5个垂直堆叠的正方形长宽比子图?

cigdeys3  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(85)

我想使用Matplotlib创建5个子图,垂直堆叠正方形纵横比。对于每个子图,x轴的限值为0至100,y轴的限值为50至1000。有人能告诉我如何达到这个数字吗?
我是Matplotlib的新手,对绘图不是很熟悉。

2uluyalo

2uluyalo1#

下面的代码是一个示例,它将产生5个子图,垂直堆叠方形纵横比:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

fig, (ax1, ax2, ax3, ax4, ax5) = plt.subplots(5, 1, figsize=(5, 15))
fig.set_figwidth(20)

x = np.random.randint(0, 100, size=20)
y = np.random.randint(50, 1000, size=20)

ax1.set_xlim([0, 100])
ax1.set_ylim([50, 1000])
ax1.set_aspect(aspect = (0.105))
ax1.scatter(x, y)

ax2.set_xlim([0, 100])
ax2.set_ylim([50, 1000])
ax2.set_aspect(aspect = (0.105))
ax2.scatter(x, y)

ax3.set_xlim([0, 100])
ax3.set_ylim([50, 1000])
ax3.set_aspect(aspect = (0.105))
ax3.scatter(x, y)

ax4.set_xlim([0, 100])
ax4.set_ylim([50, 1000])
ax4.set_aspect(aspect = (0.105))
ax4.scatter(x, y)

ax5.set_xlim([0, 100])
ax5.set_ylim([50, 1000])
ax5.set_aspect(aspect = (0.105))
ax5.scatter(x, y)

字符串
结果如下图所示:
x1c 0d1x的数据
set_aspect(aspect = (0.105))方法中的aspect = (0.105)是根据您的x和y范围计算的。如果你用100-0的x范围除以100 - 0 -50的y范围,你会得到0.105的数字,这个长宽比使你的图是正方形的。
代码中的%matplotlib inline行是当你使用jupyter notebook作为IDE时使用的,否则你不需要这行代码。

yshpjwxd

yshpjwxd2#

让我们回答你的问题的所有部分。
1.要在单个图中创建5个子图并垂直堆叠,您可以使用plt.subplots(5,1),其中第一个参数是行数,第二个参数是列数。因此,5行1列意味着5个图都垂直堆叠。您可能还希望通过添加figsize参数来设置图形的大小,该参数应该是一个元组,其中第一个参数设置宽度,第二个参数设置高度。
1.要使它们具有相同的纵横比,您需要获取每个轴并调用set_aspect,这是x与y的比率。因为你想在x中得到0-100,在y中得到50-1000,所以你可以将纵横比计算为(100 - 0)/(1000 - 50)
1.要设置限制,您可以为每个轴调用set_xlimset_ylim方法,并在其中传递下限和上限(按此顺序)。
为了有效地做到这一点,我们可以循环所有轴并绘制数据(使用numpy生成随机数)。我还为各种参数创建了变量(即极限、点数等)并计算纵横比。

import matplotlib.pyplot as plt
import numpy as np

plt.close("all")

xlim = (0, 100)
ylim = (50, 1000)
aspect = (xlim[1]-xlim[0])/(ylim[1]-ylim[0])
N = 100

rng = np.random.default_rng(42)

fig, axes = plt.subplots(5, 1, figsize=(5, 25))
for ax in axes:
    x = rng.uniform(*xlim, N)
    y = rng.uniform(*ylim, N)
    ax.plot(x, y, ".")
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    ax.set_aspect(aspect)

fig.tight_layout()
fig.show()

字符串
或者,我们可以使用plt.setp来为所有轴一次性设置所有限制和纵横比。

import matplotlib.pyplot as plt
import numpy as np

plt.close("all")

xlim = (0, 100)
ylim = (50, 1000)
aspect = (xlim[1]-xlim[0])/(ylim[1]-ylim[0])
N = 100

rng = np.random.default_rng(42)

fig, axes = plt.subplots(5, 1, figsize=(5, 25))
for ax in axes:
    x = rng.uniform(*xlim, N)
    y = rng.uniform(*ylim, N)
    ax.plot(x, y, ".")

plt.setp(axes, xlim=xlim, ylim=ylim, aspect=aspect)
fig.tight_layout()
fig.show()


绘图结果:
x1c 0d1x的数据

rkttyhzu

rkttyhzu3#

使用set_box_aspect即可

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

xlim = (0, 100)
ylim = (50, 1000)
aspect = (xlim[1]-xlim[0])/(ylim[1]-ylim[0])
N = 100

rng = np.random.default_rng(42)

fig, axes = plt.subplots(5, 1, layout='constrained', figsize=(1.9,8))
for ax in axes:
    x = rng.uniform(*xlim, N)
    y = rng.uniform(*ylim, N)

    ax.plot(x, y, 'o')
    ax.set_box_aspect(1)

plt.show()

字符串


的数据

相关问题