这是我的代码
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)
产生以下输出:
仅突出显示的部分。居中,子图周围没有太多空白。
我在互联网上发现的有关子图的其他类似帖子无法解决两个问题。如何将情节水平和垂直居中?是什么导致地块不居中?这可能是由plt.subplots_adjust()
引起的,我也不太了解。调整值有时会导致不直观的结果(我认为)。如何自动调整subplots_adjust
的值,以便对于任意数量的子图,所有内容都居中,周围没有太多空白?
答案 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)
您当然可以调整图形大小和子图参数以精确匹配。例如。首先从给定的图形宽度开始,然后考虑所有子图参数和图像的外观(此处进行更改以使其效果更加清晰),然后计算图形高度。
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)