[Python] PDFで図をまとめて保存する方法!(PdfPages)

グラフ作成

概要

こんにちは、すのくろです。

今回は、Pythonで図を一度にたくさん作成して、それらの図を「PdfPages」というものを使って、PDFにまとめて保存する方法について説明します。

具体的なアウトプット例は下記のイメージです。

PDFでまとめて保存できると一覧してデータを吟味したい時や、他の人に大量のグラフ結果を共有したい時などに便利です。

それでは、やっていきましょう!

下準備(グラフ用データの作成)

まず初めに、グラフの元となるデータを適当に作成しておきます。

コードは下記の通りです。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

data = np.random.randint(10, 50, (5, 10)) # ランダムな数値
cols = ["data_{}".format(n) for n in range(1,11)] # データ列名の作成
# データフレームの作成
df = pd.DataFrame(data, columns=cols)
df

上の画像のように、5個ずつのデータ10種類のデータフレームを作成しました。

これらの各データのグラフを作成して、PDFにまとめて保存してみたいと思います。

PDFPagesのインポート

ここからPDF保存の本題です。

まずは、下記コードで必要なライブラリ「PDFPages」をインポートしておきます。

# PdfPagesをimport
from matplotlib.backends.backend_pdf import PdfPages

これで、PDF化を行うためのインスタンスの作成ができるようになります。

PDFで保存1(1ページにグラフ画像1枚)

それではここから、グラフを作成してPDFに保存していきます。

初めにコードを示し、その後解説に入ります。

# pdfインスタンス作成
pdf = PdfPages("all_plots.pdf")

for i in range(10):
    fig, ax = plt.subplots()
    ax.plot(df[cols[i]], "o-", markersize=10, markeredgecolor = "black", color='Red')
    ax.set_ylabel(cols[i])
    ax.set_title(cols[i])
    fig.tight_layout()
    pdf.savefig(fig)
    
pdf.close()

上記画像のPDFファイル「all_plots.pdf」というものが、実行したコードと同じフォルダ内に作成されているかと思います。

上記のコードで行った流れを説明していきます。

初めに、

pdf = PdfPages("all_plots.pdf")

で、空のpdfファイルを作成しているイメージです。

次に、

for i in range(10):
    fig, ax = plt.subplots()
    ax.plot(df[cols[i]], "o-", markersize=10, markeredgecolor = "black", color='Red')
    ax.set_ylabel(cols[i])
    ax.set_title(cols[i])
    fig.tight_layout()
    pdf.savefig(fig)

でデータ10列分を1列ごとにfor文で回して折れ線グラフを作成しています。

forの中では、毎回figureを作成して、そこにプロットしたグラフを、

pdf.savefig(fig)

で初めに作成したPDFファイルに順番に保存しているイメージです。

その後、データ10列分forを回し終えたら、最後に

pdf.close() 

でPDFファイルの編集を終えて、ファイルを閉じているイメージです。

PDFで保存2(1ページにグラフ画像複数まとめる)

先ほどは1枚グラフを作成したらその作成ごとにページを更新してPDFファイルに保存していました。

これはこれで便利ですが、例えばA4の紙1枚にグラフを集約したい時などもあるかと思います。

そこで、次に、1ページにグラフ画像複数まとめる場合の例を説明します。

コードは下記になります。根本的なPDF化についてはほとんど先ほどのコードとは変わっていないです。

# pdfインスタンス作成
pdf = PdfPages("all_plots2.pdf")

fig, axes = plt.subplots(nrows=5, ncols=2, figsize=(8, 10))

for i in range(10):
    
    # 複数行列を作る場合
    axes[i//2, i%2].plot(df[cols[i]], "o-", markersize=10, markeredgecolor = "black", color='Red')
    axes[i//2, i%2].set_ylabel(cols[i])
    axes[i//2, i%2].set_title(cols[i])
    axes[i//2, i%2].set_yticks([0, 10, 20, 30, 40, 50])
    fig.tight_layout()

pdf.savefig(fig)    
pdf.close() 

上記画像のPDFファイル「all_plots2.pdf」というものが、実行したコードと同じフォルダ内に作成されていれば成功です。

今回10個のグラフを複数1ページに保存する場合は、例えば下記の様に一つのfigureに5行× 2列のaxesを配置しておきます。

fig, axes = plt.subplots(nrows=5, ncols=2, figsize=(8, 10))

この様にまずは図の枠の中に小窓を10個分作成しておきます。イメージは下記の通りです。

その後は前回と同じ様に、for文でdata列を一つずつプロットしていく形です。

この時axesを指定する方法は、少しコツがあって、

・行番号は「i//2」で、for の数iを2で割った時の商

・列番号は「i%2」で、for の数iを2で割った時の余り(0か1 )

でそれぞれ表現しています。

これによって、iが増えていった時に順番にaxesにプロットされていきます。

全てプロットした後は

fig.tight_layout()

で、グラフの横軸などが被らない様に整えてあげてます。

あとはforを回し終えた最後に、

pdf.savefig(fig)    
pdf.close() 

でPDFファイルを保存して終わりです。

グラフの配置については少し頭を使い難しいかもしれませんが、そこを乗り越えられれば簡単にPDFファイルで好きなようにグラフ画像を保存できる事がわかったかと思います。

まとめ

今回は、図を一度にたくさん作成して、それらの図を「PdfPages」というものを使って、PDFにまとめて保存する方法について説明しました。

ポイントは以下の通りです。

  • 「PDFPages」をインポート
  • 「pdf = PdfPages(“〇〇.pdf”)」でインスタンス作成
  • 「pdf.savefig(fig)」で、グラフ保存
  • 「pdf.close() 」で、編集終了

今回のPDFファイル形式で保存する方法を覚えておくと他の人と共有する時や自分で整理したい時、閲覧したい時に役立つ時があるかもなので頭の片隅にこんなやり方があったかもと覚えてもらえれば幸いです。

Pythonを中心としたプログラミングをより体系的に学びたいと言う方向けに、おすすめのオンラインスクールを2つ厳選して紹介していますので、こちらもよければご覧ください!

以上、ここまでお読みいただき、ありがとうございました!

コメント

タイトルとURLをコピーしました