
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 pdflatex
na 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):
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 subplots
nã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.