Pythonでプロットといえばmatplotlibというモジュールが有名。
Matlab的なプロットをだいたいやってくれるモジュール。
Matlabではプロットをファイルに保存するときはprint()
を使うが
matplotlibでは基本的には matplotlib.pyplot.savefig()
を使う
また、複数のプロットを複数ページのPDFにまとめる、というのはMatlabでは(たぶん)できないのだが(たしかpsではできた気がする)
matplotlibにはmatplotlib.backends.backend_pdf.PdfPages()
というのがあり、これで簡単にできる。
他にも、Matlabではpagesizeを設定しないとfigureの画面とPDFで余白とかに差ができるのだが
matplotlibではfigsizeで指定した大きさでPDFが出てくるので直感的だと思う(個人的な意見だけど)
#例: in Matlab
fig = figure()
x = normrnd(0, 1, 100);
y = normrnd(0, 1, 100);
plot(x, y, '.')
print(fig, '~/Desktop/example.png', '-dpng', '-r300')
print(fig, '~/Desktop/example.pdf', '-dpdf')
Matlabの場合、保存形式は'-dpng'とか'-dpdf'とかのオプションで指定。
#例: in Python
import os
import matplotlib.pyplot as plt
import numpy as np
x = np.random.normal(size=100)
y = np.random.normal(size=100)
fig, ax = plt.subplots()
ax.scatter(x, y)
plt.savefig(os.path.expanduser('~/Desktop/example.png'), dpi=300)
plt.savefig(os.path.expanduser('~/Desktop/example.pdf'))
複数ページのPDFを作りたい場合
import os
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
pdf = PdfPages(os.path.expanduser('~/Desktop/example.pdf'))
for n in range(3):
x = np.random.normal(size=100)
y = np.random.normal(size=100)
fig, ax = plt.subplots()
ax.scatter(x, y)
pdf.savefig()
pdf.close()
と、言う感じでPdfPagesオブジェクトのsavefigメソッドを呼ぶとactive figureが末尾に追加されていく。
PdfPages.savefig(figure)
と引数を指定すると、どのfigureを保存するかも選べる
これを使うとプロットするときにfigをリストにでも入れておいて、まとめて保存するとか
figs = []
for n in range(3):
x = np.random.normal(size=100)
y = np.random.normal(size=100)
fig, ax = plt.subplots()
ax.scatter(x, y)
figs.append(fig)
pdf = PdfPages(os.path.expanduser('~/Desktop/example.pdf'))
for fig in figs:
pdf.savefig(fig)
pdf.close()
プロットしたあとで、pyplot.get_fignums()
で開いているfigureを全部取ってきて保存するとか
for n in range(3):
x = np.random.normal(size=100)
y = np.random.normal(size=100)
fig, ax = plt.subplots()
ax.scatter(x, y)
pdf = PdfPages(os.path.expanduser('~/Desktop/example.pdf'))
for fig in plt.get_fignums():
pdf.savefig(fig)
pdf.close()
といったこともできる。
冒頭で触れたpapersizeの話とかも含めて、PDFに書き出すという点ではmatplotlibの方がMatlabより便利。