私の仕事に必要なものとして、表示媒体に応じてプロットを数字にグループ分けするプロセスを自動化することに多少の努力をしました。最初に私は各プロットを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_funcs
はmax_col
とmax_row
キーワードを取り、次いでサブプロットの記載量の図面を作成します。コードは、これはPdfPages
を使用して自動化することができる方法の概念を示します。その後、プロットされる関数のリストをループし、それぞれのサブプロット上にループします。未使用のサブプロットは削除されます。最後にすべての数字のリストが返されます。
私の例では、最初に2x3レイアウトで画面に表示する9つの異なる機能を持っています(合計2つの図、6つのサブプロット、3つのサブプロット)。ユーザーが満足している場合、プロットは2x4レイアウトで再描画されます(もう2つの数字ですが、今回は8つのサブプロットと1つのサブプロットがあります)。example in the documentationに続いてmultipage_pdf.pdf
というファイルに保存されます。
pythonでテストしました3.5
私は図を「手動」で2つに分割して同じpdfファイルに保存しなければならないと思います。 –
複数ページのpdfを 'PdfPages':https://matplotlib.org/examples/pylab_examples/multipage_pdf.htmlで保存できますが、おそらくこれを行うには2つのFigureオブジェクトを作成する必要があります – tom
複数ページのサンプルを見ましたコードを表示するために現在のレイアウトを維持し、保存するための新しいレイアウトを作成したいと考えています。元の図形からサブプロットを取得し、新しい図形に再配置する方法を見つけることができないようです.... – GSta