如何使用matplotlib绘制循环中的图像列表? [英] How to plot a list of image in loop using matplotlib?
问题描述
我有 10 个图像 ID.从每个ID中,我可以得到原始图像,基本情况,预处理,后处理路径.我将从每个路径读取图像并绘制一个带有子图的图形:列表示第四种类型的图像:原始,gt,前,后,而行表示从 1 到 10 的图像 id.
I have 10 image ids. From each ID, I can have raw image, ground truth, preprocessing, postprocessing path. I will read the image from each path and draw in a figure with sub-figures: columns indicates the fourth type of images: raw, gt, pre, post, while the rows indicate for image id from 1 to 10.
当前,我使用 gridspec
定位每个图形的子图形和从1到40的轴.我使用循环读取列表上的图像,然后使用条件在每个轴上放置图像.但是,看起来很长的代码,我认为 Python 和 matplotlib 可以有更好的方法.你能给我建议一下吗?这是我目前的实现
Currently, I use gridspec
to locate the sub figures and the axis from 1 to 40 for each image. I use a loop to read images on the list, then use conditions for place images in each axis. However, it looks very long code that I think Python and matplotlib can have a better way. Could you suggest to me the way? This is my current implementation
if __name__ == "__main__":
fig = plt.figure(figsize=(50, 50))
fig.patch.set_facecolor('white')
gs1 = gridspec.GridSpec(4, 10)
gs1.update(wspace=0.01, hspace=0.01) # set the spacing between axes.
ax1 = plt.subplot(gs1[0])
..
ax40 = plt.subplot(gs1[39])
ax1.axis('off')
...
ax40.axis('off')
ax37.text(0.5, -0.1, "(a)", size=20, ha="center",
transform=ax13.transAxes)
ax38.text(0.5, -0.1, "(b)", size=20, ha="center",
transform=ax14.transAxes)
ax39.text(0.5, -0.1, "(c)", size=20, ha="center",
transform=ax15.transAxes)
ax40.text(0.5, -0.1, "(d)", size=20, ha="center",
transform=ax16.transAxes)
image_id_list=['2011_1', '2011_2', '2012_1', '2012_1'...] #10 images id
for i in range (len(image_id_list)):
image_id=image_id_list[i]
raw_image_path='./Images/+ image_id +'jpg'
gt_image_path='./GT/+ image_id +'jpg'
pre_image_path='./Pre/+ image_id +'jpg'
post_image_path='./Post/+ image_id +'jpg'
raw_image=Image.open(raw_image_path)
gt_image=Image.open(gt_image_path)
pre_image=Image.open(pre_image_path)
post_image=Image.open(post_image_path)
if (i==0):
ax1.imshow(raw_image)
ax2.imshow(gt_image)
ax3.imshow(pre_image)
ax4.imshow(post_image)
if (i==1):
ax5.imshow(raw_image)
ax6.imshow(gt_image)
ax7.imshow(pre_image)
ax8.imshow(post_image)
if (i==2):
ax9.imshow(raw_image)
ax10.imshow(gt_image)
ax11.imshow(pre_image)
ax12.imshow(post_image)
if (i==3):
ax13.imshow(raw_image)
ax14.imshow(gt_image)
ax15.imshow(pre_image)
ax16.imshow(post_image)
...
plt.show()
fig.savefig('./result.png',bbox_inches='tight') # save the figure to file
plt.close(fig) # close the figure
推荐答案
手动"打开 40 个 Axes
非常麻烦.特别是如果所有 Axes
的大小都相同,则最好使用 plt.subplots()
函数,该函数将返回 numpy
个轴数组可以很容易地索引或循环.看看这段代码是否适合你(很难测试,因为我们没有你的输入图像):
Opening 40 Axes
'by hand' is quite cumbersome. Especially if all Axes
are the same size, it is better to use the plt.subplots()
function, which returns a numpy
array of axes that can be easily indexed or looped through. Look if this code works for you (it's hard to test, as we don't have your input images):
from matplotlib import pyplot as plt
import numpy as np
fig,axes = plt.subplots(nrows = 4, ncols = 10, figsize=(50,50))
for ax in axes.flatten():
ax.axis('off')
##edit this line to include your own image ids
image_id_list=['{}_{}'.format(i,j) for i in range(2011,2016) for j in range(1,3)]
for i,image_id in enumerate(image_id_list):
raw_image_path='./Images/'+ image_id +'jpg'
raw_image = Image.open(raw_image_path)
axes[0,i].imshow(raw_image)
gt_image_path='./Images/'+ image_id +'jpg'
gt_image = Image.open(gt_image_path)
axes[0,i].imshow(gt_image)
pre_image_path='./Images/'+ image_id +'jpg'
pre_image = Image.open(pre_image_path)
axes[0,i].imshow(pre_image)
post_image_path='./Images/'+ image_id +'jpg'
post_image = Image.open(post_image_path)
axes[0,i].imshow(post_image)
plt.show()
这篇关于如何使用matplotlib绘制循环中的图像列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!