lit*_*019 3 python matplotlib jupyter-notebook
我需要在网格中显示 20 张图像,我的代码如下
def plot_matric_demo(img, nrows, ncols):
fig, ax = plt.subplots(nrows=nrows, ncols=ncols)
cur_index = 0
for row in ax:
for col in row:
col.imshow(img)
cur_index = cur_index + 1
col.axis('off')
plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
plt.show()
subplot_img = cv2.imread("subplots.png")
plot_matric_demo(subplot_img, 5, 4)
Run Code Online (Sandbox Code Playgroud)
好像子图中的图像太小了,同时距离很大,我想知道如何使子图中的图像变大?
TL;DR用于plt.subplots(nrows=nr, ncols=nc, figsize=(..., ...))调整图形大小,以便单个子图至少具有与要显示的图像大致相同的纵横比。
关键是,imshow将使用方形像素,因此如果您的图像具有 1:2 的纵横比,则绘制的图像将具有 1:2 的纵横比,并且每个图像都将位于其自己的子图的中间 - 如果纵横比子图的比例与图像的纵横比不同,您将遇到“大白边综合症”。
让我们从导入和假图像开始,纵横比为 1:2
In [1]: import numpy as np
...: import matplotlib.pyplot as plt
In [2]: img = np.arange(54*108).reshape(108,54)
Run Code Online (Sandbox Code Playgroud)
并复制您的安排,其中您将 8x6 (x:y) 图形细分为 4x5 (x:y) 子图 - 您有水平宽 (8/4=2) 和垂直短 (6/5=1.2) 的子图并且每个图像在其子图中居中时,都有一个宽的水平边距。
In [3]: f, axs = plt.subplots(5, 4)
...: for x in axs.flatten():
...: x.imshow(img) ; x.axis('off')
Run Code Online (Sandbox Code Playgroud)
现在恢复行和列的角色,现在你的子图在水平方向上更小 (8/5=1.6) 和更高 (6/4=1.5),由于水平白边距减少和增加图像大小,因为可用高度更大
In [4]: f, axs = plt.subplots(4, 5)
...: for x in axs.flatten():
...: x.imshow(img) ; x.axis('off')
Run Code Online (Sandbox Code Playgroud)
为了结束这个故事,关键是要有与您使用的图像具有(至少大约)相同纵横比的子图,为此我们必须干预figsize参数,分配一个宽度:高度相等to (ncols×1):(nrows×2),在我下面的例子中figsize=(5,8)
In [5]: f, axs = plt.subplots(4, 5, figsize=(5,8))
...: for x in axs.flatten():
...: x.imshow(img) ; x.axis('off')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1245 次 |
| 最近记录: |