Matplotlib:子图的居中

时间:2018-07-24 14:39:47

标签: python matplotlib

这是我的代码

import matplotlib.pyplot as plt
import numpy as np

steps = 20
fig = plt.figure()
for k in range(steps):
    ax = fig.add_subplot(1,steps,(k+1))
    ax.imshow(np.random.rand(30,30), interpolation="none", cmap="gray")
    ax.axis("off")
fig.tight_layout()
plt.subplots_adjust(right=0.97,\
                    left=0.03,\
                    bottom=0.03,\
                    top=0.97,\
                    wspace=0.1,\
                    hspace=0.1)
plt.savefig("test.png", dpi=300, bbox_inches="tight")
plt.close(fig)

产生以下输出:

enter image description here

但是我真的很想拥有这样的东西: enter image description here

仅突出显示的部分。居中,子图周围没有太多空白。

我在互联网上发现的有关子图的其他类似帖子无法解决两个问题。如何将情节水平和垂直居中?是什么导致地块不居中?这可能是由plt.subplots_adjust()引起的,我也不太了解。调整值有时会导致不直观的结果(我认为)。如何自动调整subplots_adjust的值,以便对于任意数量的子图,所有内容都居中,周围没有太多空白?

1 个答案:

答案 0 :(得分:1)

bbox_inches="tight"自动尝试从图形中“猜测”要裁剪多少。如果您想完全控制位置,可能会导致不良结果。

现在的主要目的是首先获得所需大小的图形。

要进行粗略估计,图形高度将需要为1 /步,外加一些空白。例如

steps = 20
fig = plt.figure(figsize=(12,(12+3)/steps))

给出一个不错的结果

import matplotlib.pyplot as plt
import numpy as np

steps = 20
fig = plt.figure(figsize=(12,(12+3)/steps))
for k in range(steps):
    ax = fig.add_subplot(1,steps,(k+1))
    ax.imshow(np.random.rand(30,30), interpolation="none", cmap="gray")
    ax.axis("off")

plt.subplots_adjust(right=0.97,\
                    left=0.03,\
                    bottom=0.03,\
                    top=0.97,\
                    wspace=0.1,\
                    hspace=0.1)
plt.savefig("test.png", dpi=300, facecolor="palegreen")
plt.show()
plt.close(fig)

enter image description here

您当然可以调整图形大小和子图参数以精确匹配。例如。首先从给定的图形宽度开始,然后考虑所有子图参数和图像的外观(此处进行更改以使其效果更加清晰),然后计算图形高度。

import matplotlib.pyplot as plt
import numpy as np

steps = 20

# subplot parameters
sp = dict(right=0.98,\
          left=0.02,\
          bottom=0.1,\
          top=0.9,\
          wspace=0.1,\
          hspace=0.1)
figw = 12 #inches
aspect = 30/50 # aspect of the images (heigth/width)
axs = (figw*(sp["right"]-sp["left"]))/(steps+(steps-1)*sp["wspace"])
figh = axs*aspect/(sp["top"]-sp["bottom"])

fig = plt.figure(figsize=(figw, figh))

for k in range(steps):
    ax = fig.add_subplot(1,steps,(k+1))
    ax.imshow(np.random.rand(30,50), interpolation="none", cmap="gray")
    ax.axis("off")

plt.subplots_adjust(**sp)
plt.savefig("test.png", dpi=300, facecolor="palegreen")
plt.show()
plt.close(fig)

enter image description here