将多个图像保存为PDF而不更改Subplot的格式

6

我有一个像下面这样的 df。我的目标是尝试循环遍历包含路径的 df 列并将图像作为子图打印在在axis0上具有图像路径的一列,而另一列路径则在axis1

      identity       VGG-Face_cosine    img                 comment
0   ./clip_v4/3.png   1.110223e-16  .\clip_v3\0.png        .\clip_v3\0.png is matched with ./clip_v4/3.png
0   ./clip_v4/2.png   2.220446e-16  .\clip_v3\1.png        .\clip_v3\1.png is matched with ./clip_v4/2.png
1   ./clip_v4/4.png   2.220446e-16  .\clip_v3\1.png        .\clip_v3\1.png is matched with ./clip_v4/4.png
2   ./clip_v4/5.png   2.220446e-16  .\clip_v3\1.png        .\clip_v3\1.png is matched with ./clip_v4/5.png
0   ./clip_v4/2.png   2.220446e-16  .\clip_v3\2.png        .\clip_v3\2.png is matched with 

我正在循环遍历这两列 identityimg,并按如下方式绘制

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from matplotlib import rcParams


df = df.iloc[1:]
#merged_img = []


for index, row in df.iterrows():

    # figure size in inches optional
    rcParams['figure.figsize'] = 11 ,8

    # read images
    
    img_A = mpimg.imread(row['identity'])
    img_B = mpimg.imread(row['img'])

    # display images
    fig, ax = plt.subplots(1,2)
 
    
    ax[0].imshow(img_A)
    ax[1].imshow(img_B)
    
    

以下是我得到的样本输出。

###控制台输出

样例控制台输出

到目前为止还好。我的下一个想法是将这些图像与子图一起保存在 PDF 中。我不想改变它打印的方式。就像我只想在 PDF 中并排放置 2 张图片。我已经查阅了许多可用的解决方案。但我无法将我的代码部分与文档中提供的逻辑联系起来。是否有任何方法可以实现我的目标?任何参考资料都将有所帮助!感谢您提前的帮助。


你想保存这个图形吗?Fig.savefig会保存为pdf。 - Jody Klymak
嗨 @JodyKlymak 我尝试了...正如你所看到的,我们一次只打印2张图像,而不是追加图像...只有最后2张图像被保存。 - user17993062
将 savefig 放在循环中。 - Jody Klymak
2个回答

4
使用 matplotlib.backends.backend_pdfPdfPages,将每个图形分别保存在同一 pdf 文件的不同页面上:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from matplotlib import rcParams
from matplotlib.backends.backend_pdf import PdfPages

df = df.iloc[1:]
rcParams['figure.figsize'] = 11 ,8
pdf_file_name = 'my_images.pdf' 

with PdfPages(pdf_file_name) as pdf:

    for index, row in df.iterrows():
        img_A = mpimg.imread(row['identity'])
        img_B = mpimg.imread(row['img'])
        fig, ax = plt.subplots(1,2)
        ax[0].imshow(img_A)
        ax[1].imshow(img_B)

        # save the current figure at a new page in pdf_file_name
        pdf.savefig()   

另请参阅 https://matplotlib.org/stable/api/backend_pdf_api.html


1

如果您想将所有图形合并为一个,请提前设置正确数量的子图:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from matplotlib import rcParams

df = pd.DataFrame(
    {
        "identity": ["0.png", "2.png", "4.png"],
        "img": ["1.png", "3.png", "5.png"],
    }
)

fig, ax = plt.subplots(len(df), 2, figsize=(11, 8*len(df)))

for [index, row], axrow in zip(df.iterrows(), ax):

    # read images
    img_A = mpimg.imread(row["identity"])
    img_B = mpimg.imread(row["img"])

    # display images

    axrow[0].imshow(img_A)
    axrow[1].imshow(img_B)

plt.savefig("all_images.png")
plt.close()

这是输出结果的样子(输入是一些stackoverflow用户图片): row_0 row_1 row_2

嗨@mmdanziger...你的回答很有道理...但是为什么我会得到3个不同的PDF文件呢?我期望所有的图像都在一个PDF文件中...我们需要将它们附加到同一个PDF文件中。 - user17993062
哦!那不太清楚。你想要一个任意高的PDF文件吗? - mmdanziger
是的...我想把所有图片保存在一个PDF中{具有相同的格式}...对于我的错误澄清感到抱歉。 - user17993062
1
关于空间,您应该根据特定图像的几何形状调整figsize。还要添加plt.tight_layout。 - mmdanziger
1
重新附加时,请勿附加行,而是使用图像填充现有行。除非确实必须这样做,否则不要动态调整大小。 - mmdanziger
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接