Criação automática de uma grade de imagens

Criação automática de uma grade de imagens

Tenho várias imagens em PDF que gerei com matplotlib. Quero poder organizá-los em uma grade arbitrária. Para esse propósito, escrevi um script python que, por sua vez, escreve e executa látex.

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--images', nargs='+', help='List of images to be processed')
    parser.add_argument('--output', help='Output file name', default='output_grid.pdf')
    parser.add_argument('--grid', nargs=2, type=int, help='Grid dimensions (rows, columns)')
    args = parser.parse_args()
    return args

def main():
    args = parse_args()
    assert len(args.images) == args.grid[0]*args.grid[1], "Number of images does not match grid dimensions"
    tex_outfile = "_{}_.tex".format(random.randint(0,100000))
    with open(tex_outfile, 'w') as f:
        f.write("\\documentclass[varwidth]{standalone}\n")
        f.write("\\usepackage[pdftex]{graphicx, color}\n")
        f.write("\\begin{document}\n")
        f.write("\\begin{{tabular}}{{{}}}\n".format(" c "*args.grid[1]))
        for k,v in enumerate(args.images):
            f.write("\\includegraphics[width={:.9f}\\linewidth,keepaspectratio]{{{}}}".format(1.0/(args.grid[1] + 1), v))
            if (k+1) % args.grid[1] != 0:
                f.write(" & ")
            else: 
                f.write(" \\\\\n")
        f.write("\\end{tabular}\n")
        f.write("\\end{document}\n")
    os.system("pdflatex {}".format(tex_outfile))
    os.system("mv {}.pdf {}".format(tex_outfile[:-4], args.output))
    os.system("rm {}*".format(tex_outfile[:-4]))

O código python acima gera o Latex abaixo, que é então executado pdflatexna linha de código pythonos.system("pdflatex {}".format(tex_outfile))

\documentclass[varwidth]{standalone}
\usepackage[pdftex]{graphicx, color}
\begin{document}
\begin{tabular}{ c  c }
\includegraphics[width=0.333333333\linewidth,keepaspectratio]{image1.pdf} & \includegraphics[width=0.333333333\linewidth,keepaspectratio]{image2.pdf} \\
\includegraphics[width=0.333333333\linewidth,keepaspectratio]{image3.pdf} & \includegraphics[width=0.333333333\linewidth,keepaspectratio]{image4.pdf} \\
\end{tabular}
\end{document}

O problema que tenho é que as imagens não estão perfeitamente alinhadas, veja esta imagem (convertida para png para stackexchange):

insira a descrição da imagem aqui

Acho que o problema de alinhamento se deve aos y-ticks com comprimentos diferentes. Existe uma maneira de corrigir isso no código que forneci? Ou uma alternativa que pode ser um método melhor (o uso subplotsnão funcionará porque as imagens individuais já são fornecidas em PDF).

Responder1

alinhe-os à direita, não ao centro, para que o comprimento da etiqueta à esquerda não afete as coisas e use a escala e não a largura, para que as imagens sejam dimensionadas na mesma quantidade, de modo que os gráficos tenham o mesmo tamanho se tivessem o mesmo tamanho originalmente.

informação relacionada