2017-06-21 59 views
1

私は、次の操作を実行しようとしています:Pythonのmatplotlibの:複数のページでPDFに保存する

私はいくつかのサブプロットとmatplotlibのを、使用して、図を作成しました。 具体的には、2x4のサブプロット

出力は画面に表示するのには最適ですが、pdfに保存することはできません。

ちょうどsave_figを使用すると、2x4グリッドのPDFファイルが1ページ印刷されます。

私がしたいのは、サブプロットを再配置して、2x4グリッド(どのサブプロットをどこに配置するかを選択することはいいが、必要ではない)を決め、4ページの2ページのpdfサブプロット(A4ページサイズに合わせるため)

これは可能ですか?

ありがとうございました!

+1

私は図を「手動」で2つに分割して同じpdfファイルに保存しなければならないと思います。 –

+1

複数ページのpdfを 'PdfPages':https://matplotlib.org/examples/pylab_examples/multipage_pdf.htmlで保存できますが、おそらくこれを行うには2つのFigureオブジェクトを作成する必要があります – tom

+0

複数ページのサンプルを見ましたコードを表示するために現在のレイアウトを維持し、保存するための新しいレイアウトを作成したいと考えています。元の図形からサブプロットを取得し、新しい図形に再配置する方法を見つけることができないようです.... – GSta

答えて

2

3桁の数字を作成することをお勧めします。 1つは表示用、2つは同じデータを保存してプロットするためのものです。

import matplotlib.pyplot as plt 
import numpy as np 


data = np.sort(np.cumsum(np.random.rand(24,16), axis=0), axis=0) 

def plot(ax, x, y, **kwargs): 
    ax.plot(x,y, **kwargs) 

colors = ["crimson", "indigo", "limegreen", "gold"] 
markers = ["o", "", "s", ""] 
lines = ["", "-", "", ":"] 

# figure 0 for showing 
fig0, axes = plt.subplots(nrows=2,ncols=4) 

for i, ax in enumerate(axes.flatten()): 
    plot(ax, data[:,2*i], data[:,2*i+1], marker=markers[i%4], ls=lines[i%4],color=colors[i%4]) 


# figure 1 for saving 
fig1, axes = plt.subplots(nrows=1,ncols=4) 
for i, ax in enumerate(axes.flatten()): 
    plot(ax, data[:,2*i], data[:,2*i+1], marker=markers[i], ls=lines[i],color=colors[i]) 

#figure 2 for saving 
fig2, axes = plt.subplots(nrows=1,ncols=4) 
for i, ax in enumerate(axes.flatten()): 
    plot(ax, data[:,2*i+4], data[:,2*i+1+4], marker=markers[i], ls=lines[i],color=colors[i]) 

#save figures 1 and 2 
fig1.savefig(__file__+"1.pdf") 
fig2.savefig(__file__+"2.pdf") 

#close figures 1 and 2 
plt.close(fig1) 
plt.close(fig2) 
#only show figure 0 
plt.show() 
1

私の仕事に必要なものとして、表示媒体に応じてプロットを数字にグループ分けするプロセスを自動化することに多少の努力をしました。最初に私は各プロットを1回だけ実行し、pdfに保存する数値にサブプロットを追加しましたが、悲しいことにthis answerのコメントによれば、これは不可能なので、すべてを再プロットする必要があります。コア機能

from matplotlib import pyplot as plt 
import numpy as np 
from matplotlib.backends.backend_pdf import PdfPages 


def niter(iterable, n): 
    """ 
    Function that returns an n-element iterator, i.e. 
    sub-lists of a list that are max. n elements long. 
    """ 
    pos = 0 
    while pos < len(iterable): 
     yield iterable[pos:pos+n] 
     pos += n 


def plot_funcs(x, functions, funcnames, max_col, max_row): 
    """ 
    Function that plots all given functions over the given x-range, 
    max_col*max_row at a time, creating all needed figures while doing 
    so. 
    """ 

    ##amount of functions to put in one plot  
    N = max_col*max_row 

    ##created figures go here 
    figs = [] 

    ##plotted-on axes go here 
    used_axes = [] 

    ##looping through functions N at a time: 
    for funcs, names in zip(niter(functions, N), niter(funcnames,N)): 

     ##figure and subplots 
     fig, axes = plt.subplots(max_col, max_row) 

     ##plotting functions 
     for name,func,ax in zip(names, funcs, axes.reshape(-1)): 
      ax.plot(x, func(x)) 
      ax.set_title(name) 
      used_axes.append(ax) 

     ##removing empty axes: 
     for ax in axes.reshape(-1): 
      if ax not in used_axes: 
       ax.remove() 

     fig.tight_layout() 
     figs.append(fig) 

    return figs 

##some functions to display 
functions = [ 
    lambda x: x, lambda x: 1-x, lambda x: x*x, lambda x: 1/x, #4 
    np.exp, np.sqrt, np.log, np.sin, np.cos,     #5 
    ] 
funcnames = ['x','1-x', 'x$^2$', '1/x', 'exp', 'sqrt', 'log', 'sin','cos'] 

##layout for display on the screen 
disp_max_col = 3 
disp_max_row = 2 

##layout for pdf 
pdf_max_col = 2 
pdf_max_row = 4 

##displaying on the screen: 
x = np.linspace(0,1,100) 
figs = plot_funcs(x, functions, funcnames, disp_max_row, disp_max_col) 
plt.show() 


##saving to pdf if user wants to: 
answer = input('Do you want to save the figures to pdf?') 
if answer in ('y', 'Y', 'yes', ''): 

    ##change number of subplots 
    N = disp_max_col*disp_max_row 
    figs = plot_funcs(x, functions, funcnames, pdf_max_row, pdf_max_col) 

    ##from https://matplotlib.org/examples/pylab_examples/multipage_pdf.html 
    with PdfPages('multipage_pdf.pdf') as pdf: 
     for fig in figs: 
      plt.figure(fig.number) 
      pdf.savefig() 

plot_funcsmax_colmax_rowキーワードを取り、次いでサブプロットの記載量の図面を作成します。コードは、これはPdfPagesを使用して自動化することができる方法の概念を示します。その後、プロットされる関数のリストをループし、それぞれのサブプロット上にループします。未使用のサブプロットは削除されます。最後にすべての数字のリストが返されます。

私の例では、最初に2x3レイアウトで画面に表示する9つの異なる機能を持っています(合計2つの図、6つのサブプロット、3つのサブプロット)。ユーザーが満足している場合、プロットは2x4レイアウトで再描画されます(もう2つの数字ですが、今回は8つのサブプロットと1つのサブプロットがあります)。example in the documentationに続いてmultipage_pdf.pdfというファイルに保存されます。

pythonでテストしました3.5

関連する問題