
Tengo varias imágenes en pdf que he generado con matplotlib
. Quiero poder organizarlos en una cuadrícula arbitraria. Para ello, he escrito un script en Python que a su vez escribe y ejecuta 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]))
El código de Python anterior genera el siguiente Latex, que luego se ejecuta pdflatex
en la línea de código de Python.os.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}
El problema que tengo es que las imágenes no están perfectamente alineadas, mira esta imagen (convertida a png para stackexchange):
Creo que el problema de alineación se debe a que las marcas y difieren en longitud. ¿Hay alguna manera de solucionar este problema en el código que proporcioné? O una alternativa que podría ser un método mejor (usarlo subplots
no funcionará porque las imágenes individuales ya se proporcionan en formato PDF).
Respuesta1
alinéelos a la derecha, no al centro, para que la longitud de la etiqueta izquierda no afecte las cosas y use la escala, no el ancho, para que las imágenes se escale en la misma cantidad, de modo que las gráficas tengan el mismo tamaño si tuvieran el mismo tamaño originalmente.