2017-12-01 1 views
1

Ich habe dieses Problem für eine ziemlich lange Zeit, aber ich bin nicht in der Lage, eine Antwort zu finden.Bildunterschriften für matshow() s in mehrseitigen pdf

Also, ich habe eine Liste mit Matrizen, die ich (für die Zwecke dieser Frage darstellen möchten Ich bin nur 2 Zufallsmatrizen mit:

list = [np.random.random((500, 500)), np.random.random((500, 500))] 

Ich möchte dann jedes Element der Liste plotten matshow in einer anderen Seite als pDF-Datei mit:

with PdfPages('file.pdf') as pdf: 
    plt.rc('figure', figsize=(3,3), dpi=40) 
    for elem in list: 
     plt.matshow(elem, fignum=1) 
     plt.title("title") 
     plt.colorbar() 
     plt.text(0,640,"Caption") 
     pdf.savefig() # saves the current figure into a pdf page 
     plt.close() 

das Ergebnis ist folgendes: enter image description here

übt blem ist mit der Beschriftung. Sie können sehen, dass ich "Caption" absichtlich in den Rand des Dokuments eingefügt habe. Dies liegt daran, dass manchmal die eigentlichen Beschriftungen, die ich einfügen möchte, zu groß sind, um in eine einzige PDF-Seite zu passen.

Also, wie kann ich jede PDF-Seite an den Inhalt der Bildunterschrift anpassen (das kann auf jeder Seite variieren)? Wäre es beispielsweise möglich, jede Seitengröße auf A4 oder A3 zu setzen und dann alles auf jeder Seite zu zeichnen/zu schreiben?

Ich habe bereits versucht, plt.figure(figsize=(X, X)) mit einer Variablen X Größe einzurichten, aber es ändert nur die Auflösung der pdf ich denke.

Antwort

1

Sie können die Option bbox_inches="tight" beim Speichern der Datei verwenden. Dies passt die Größe der Figur an ihren Inhalt an. Es reicht also aus, einen Text an der Position (0,0) in den Bildkoordinaten zu platzieren und ihn nach oben auszurichten. Dies wird sich dann nach unten und außerhalb der Figur erstrecken (so dass die Figur, wenn sie auf dem Bildschirm erscheint, diesen Text nicht enthalten würde), aber mit der Option von savefig bbox_inches="tight" wird die gespeicherte Figur groß genug, um diesen Text zu enthalten.
Die Verwendung des Textverpackungspakets erlaubt es dann auch, den Text in horizontaler Richtung zu begrenzen.

import numpy as np; np.random.seed(1) 
import textwrap 
import matplotlib.pyplot as plt 
from matplotlib.backends.backend_pdf import PdfPages 

p = np.ones(12); p[0] = 7 
text2 = "".join(np.random.choice(list(" abcdefghijk"),p=p/p.sum(), size=1000)) 
text2 = textwrap.fill(text2, width=80) 
texts = ["Caption: Example", "Caption 2: " + text2 ] 

lis = [np.random.random((500, 500)), np.random.random((500, 500))] 

with PdfPages('file.pdf') as pdf: 
    for elem,text in zip(lis,texts): 
     fig = plt.figure(dpi=100) 

     grid_size = (3,1) 

     plt.imshow(elem) 
     plt.title("title") 
     plt.colorbar() 

     fig.text(0,0, text, va="top") 

     plt.tight_layout() 
     pdf.savefig(bbox_inches="tight") 
     plt.close() 

enter image description here

+0

Danke, das ist genau das, was ich wollte! – tjiagoM

0

Ich glaube, ich habe eine Antwort auf diese Frage mich, was das Problem für meinen Text zu haben genug Platz löst kommen:

jedoch eine perfekte Antwort würde jede Seite Größe dynamisch sein zu machen, nach dem Menge an Bildunterschrift, die ich gesetzt habe.

Wie auch immer, ist meine Antwort die folgende (I im Wesentlichen jede Seite in einem Raster mit drei Reihen unterteilt, die oberen zwei Reihen für den Stellplätzen zu machen, und die letzte nur für die Beschriftung):

with PdfPages('file.pdf') as pdf: 
    for elem in list: 
     fig = plt.figure(figsize=(8.27, 11.69), dpi=100) 

     grid_size = (3,1) 

     plt.subplot2grid(grid_size, (0, 0), rowspan=2, colspan=1) 

     plt.imshow(elem) 
     plt.title("title") 
     plt.colorbar() 

     plt.subplot2grid(grid_size, (2, 0), rowspan=2, colspan=1) 
     plt.axis('off') 
     plt.text(0,1,"Caption") 

     plt.tight_layout() 
     pdf.savefig() 
     plt.close() 

Welche erzeugt auf jeder Seite folgendes: enter image description here

Könnte jemand eine bessere Lösung finden? :)

Verwandte Themen