Matplotlib-为不同布局保持一致的子图大小

时间:2020-09-17 23:09:55

标签: python matplotlib plot

我正面临我认为将是一个简单的问题,但是我正在努力寻找一个简单且可扩展的解决方案。基本上,我想在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设置为10in x 6in,例如,对于3x2布局,设置为10in x 9in。

这使得每个图形中的子图在大小上都非常相似,但并不完全相同(我通过在Adobe Illustrator中导入每个图形并检查轴尺寸来进行确认。)

是否可以使用一种简单且可扩展的方法来确保每个图中任意数量的子图及其布局的子图大小相同?我会假设在某个地方而不是指定figsize,而是设置子图大小,但是我还没有发现任何东西...

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

您可能要使用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')