2017-12-01 2 views
1

私はかなり長い間この問題を抱えていましたが、私は答えを見つけることができません。私は、リストの各要素をプロットしたい複数ページpdfのmatshow()のキャプション

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

だから、私はちょうど2つのランダム行列を抱えているこの質問のために(プロットしたい行列のリストを持っていますPDFファイルの別のページでmatshowを使用して:

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

結果は以下の通りです: enter image description here

マイプロblemはキャプション付きです。私は「キャプション」を目的の文書の端に置くことができます。これは、挿入する実際のキャプションが単一のpdfページに収まらないほど大きすぎることがあるためです。

キャプションのコンテンツ(ページごとに異なる可能性があります)に合わせて各PDFページを調整するにはどうすればよいですか。たとえば、各ページサイズをA4またはA3に設定し、各ページのすべてをプロット/書込みすることは可能でしょうか?

私は既にXというサイズのplt.figure(figsize=(X, X))を設定しようとしましたが、それはちょうど私が推測するpdfの解像度を変更します。

答えて

1

ファイルを保存するときにbbox_inches="tight"オプションを使用します。これは図形のサイズをその内容に適合させる。そのため、図形座標の位置(0,0)にテキストを配置して、それを上部に揃えるだけで十分です。これは、図の下側と外側(画面上に表示された図にそのテキストが含まれないため)になりますが、savefigのbbox_inches="tight"オプションを使用すると、保存された図形はそのテキストを含むのに十分な大きさになります。
textwrapパッケージを使用すると、テキストを水平方向に制限することもできます。

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

私は私が私のテキストのための十分なスペースを持っていることの問題を解決した、この質問に対する答えを自分自身を出ていると思う:

しかし、完璧な答えはによると、各ページのサイズを動的に作成することになります私が付けたキャプションの量。

とにかく、私の答えは(私は基本的にプロットするために、上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

誰かがより良い解決策を見つけることができますか? :)

関連する問題