matplotlib 为不同布局保持一致的子地块大小

o2rvlv0m  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(125)

我正面临着一个我以为会很简单的问题,但我却在努力寻找一个简单且可扩展的解决方案。基本上,我想在Matplotlib中制作一些图,每个图具有不同数量的子图和不同的布局。
我对这些图形的具体要求是,我希望所有图形中的所有子图都具有相同的大小。
我尝试过的最简单的解决方案是根据子图的数量缩放figsize

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig, ax = plt.subplots(2, 2, figsize=(10,6))
for i in ax.flatten():
    i.plot(x, y)
plt.savefig('f1.pdf')

fig, ax = plt.subplots(3, 2, figsize=(10,9))
for i in ax.flatten():
    i.plot(x, y)
plt.savefig('f2.pdf')

fig, ax = plt.subplots(2, 3, figsize=(15,6))
for i in ax.flatten():
    i.plot(x, y)
plt.savefig('f3.pdf')

因此,在上面的代码中,对于2x2布局,figsize设置为10 in x 6 in,例如,对于3x 2布局,figsize设置为10 in x 9 in。
这使得每个图中的子图在大小方面非常相似,但并不完全相同(我通过在Adobe Illustrator中导入每个图并检查轴尺寸来检查)。
有没有一种简单且可扩展的方法,可以用来确保任意数量的子区及其布局在每个图中具有相同的子区大小?我会假设这样的情况:我设置了子区大小,而不是指定figsize,但我还没有想出任何办法...
任何帮助将不胜感激!

dsf9zpds

dsf9zpds1#

您可能需要使用AxesDivider。以下示例创建所有3.5”宽(Size.Fixed(3.5))x 2.0”高(Size.Fixed(2))的轴,并均匀地(Size.Scaled(1)用于所有焊盘)拆分用于填充的剩余空间。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import Divider, Size    

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

sc = Size.Scaled(1)
fh = Size.Fixed(3.5)
fv = Size.Fixed(2)

fig, ax = plt.subplots(2, 2, figsize=(10,6))
h = [sc, fh] * 2 + [sc]
v = [sc, fv] * 2 + [sc]
divider = Divider(fig, (0.0, 0.0, 1., 1.), h, v)
for i in range(2):
    for j in range(2):
        ax[i,j].set_axes_locator(divider.new_locator(nx=2*i+1, ny=2*j+1))
for i in ax.flatten():
    i.plot(x, y)
plt.savefig('f1.pdf')

fig, ax = plt.subplots(3, 2, figsize=(10,9))
h = [sc, fh] * 2 + [sc]
v = [sc, fv] * 3 + [sc]
divider = Divider(fig, (0.0, 0.0, 1., 1.), h, v)
for i in range(3):
    for j in range(2):
        ax[i,j].set_axes_locator(divider.new_locator(nx=2*j+1, ny=2*i+1))
for i in ax.flatten():
    i.plot(x, y)
plt.savefig('f2.pdf')

fig, ax = plt.subplots(2, 3, figsize=(15,6))
h = [sc, fh] * 3 + [sc]
v = [sc, fv] * 2 + [sc]
divider = Divider(fig, (0.0, 0.0, 1., 1.), h, v)
for i in range(2):
    for j in range(3):
        ax[i,j].set_axes_locator(divider.new_locator(nx=2*j+1, ny=2*i+1))
for i in ax.flatten():
    i.plot(x, y)
plt.savefig('f3.pdf')

相关问题