2017-12-01 4 views
1

나는이 문제를 꽤 오랫동안 해왔지만 대답을 찾을 수 없다. 내가 다음 목록의 각 요소를 플롯 할다중 페이지 pdf의 matshow() 캡션

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

:

그래서, 난 그냥이 임의의 행렬을 보내고있어이 질문을 위해 (플롯하려는 행렬이있는 목록을 가지고 PDF 파일의 별도의 페이지에 matshow를 사용 : 내 프로 enter image description here

:

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() 

결과하면 다음과 같다 흠집은 자막과 함께 있습니다. 당신은 목적에 따라 "캡션"을 문서의 가장자리에 넣는 것을 볼 수 있습니다. 삽입하려는 실제 캡션이 너무 커서 단일 PDF 페이지에 맞지 않을 수 있기 때문입니다.

그래서 각 PDF 페이지를 캡션의 내용 (각 페이지마다 다를 수 있음)에 맞게 조정할 수 있습니까? 예를 들어 각 페이지 크기를 A4 또는 A3로 설정 한 다음 각 페이지의 모든 것을 플로트/쓰는 것이 가능합니까?

나는 X 크기의 변수를 가지고 이미 plt.figure(figsize=(X, X))을 설정하려고 시도했지만 PDF의 해상도는 변경됩니다. 에 따라,

그러나, 완벽한 대답은 각 페이지의 크기를 동적으로 만드는 것입니다 :

답변

1

파일을 저장할 때 bbox_inches="tight" 옵션을 사용할 수 있습니다. 그러면 그림 크기가 내용에 맞게 조정됩니다. 따라서 그림 좌표에서 위치가 (0,0) 인 텍스트를 배치하고 상단에 맞 춥니 다. 그러면 그림의 아래쪽과 바깥쪽으로 확장됩니다 (화면에 표시된 그림에는 해당 텍스트가 포함되지 않음). 그러나 savefig의 bbox_inches="tight" 옵션을 사용하면 저장된 그림은 해당 텍스트를 포함 할만큼 커집니다.
텍스트 랩 패키지를 사용하면 텍스트를 가로 방향으로 제한 할 수 있습니다.

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

덕분에, 그게 내가 원하는 것을 정확히! – tjiagoM

0

나는 내 텍스트에 대한 충분한 공간을 가지고있는 문제를 해결이 질문에 자신에 대한 답변으로 올라와있다 생각 내가 쓴 자막의 양.

어쨌든

, 내 대답은 다음 (I 본질적으로 플롯에 대한 상위 2 개 행을 3 행으로 그리드의 각 페이지를 구분하고, 단지 자막의 마지막) :

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() 

을 어느 각 페이지에 다음과 같이 표시됩니다. enter image description here

더 나은 솔루션을 찾을 수 있습니까? :)