SymPy で作成したグラフの部分だけをファイルとして保存する の補足。
フォントに関するエラーを避けて,Python の matplotlib.pyplot.plot()
や sympy.plotting.plot.plot()
で作成したグラフの部分だけを(フォントに関するエラーを回避して) pdf として保存する。
追記:以下のエラーの件は,matplotlib のバージョンアップにより解消された模様です。以下の記事を参照:
症状:pdf として保存しようとするとエラー
matplotlib.pyplot.plot()
の場合
# NumPy も使います
import numpy as np
# Matplotlib でグラフを描きます
import matplotlib.pyplot as plt
# 以下はグラフを SVG で Notebook にインライン表示させる設定
%config InlineBackend.figure_formats = ['svg']
plt.savefig()
で pdf として保存しようとすると,以下のようにフォントに関するエラーが出て,まともな pdf ファイルとして保存されない。
x = np.linspace(-2*np.pi, 2*np.pi, 100)
plt.plot(x, np.sin(x));
plt.savefig('err-pltplot.pdf')
sympy.plotting.plot.plot()
の場合
# SymPy を使うときのおまじない
from sympy import *
from sympy.abc import *
from sympy import pi
# 以下はグラフを SVG で Notebook にインライン表示させる設定
%config InlineBackend.figure_formats = ['svg']
.save()
で pdf として保存しようとすると,フォントに関するエラーが出て,まともな pdf ファイルとして保存されない。
p1 = plot(sin(t), (t, -2*pi, 2*pi));
p1.save('./err-plot.pdf')
解決策
pdf として保存する前に以下の呪文を唱える。(sympy.plotting.plot.plot()
も matplotlib を呼んでいるので同様。)
# グラフを pdf で保存する場合
from matplotlib import rcParams
rcParams['pdf.fonttype'] = 42
保存成功!
matplotlib.pyplot.plot()
の場合
x = np.linspace(-2*np.pi, 2*np.pi, 100)
plt.plot(x, np.sin(x));
plt.savefig('saved-pltplot.pdf')
sympy.plotting.plot.plot()
の場合
(plot()
に show=False
オプションをつけないと,グラフが2回表示されるのはご愛嬌。)
p1 = plot(sin(t), (t, -2*pi, 2*pi));
p1.save('./saved-plot.pdf')
問題点:pdf のファイルサイズがでかい
こんな簡単なグラフの pdf が 16MB にもなる。
%%bash
rm -f err-*.pdf
ls -lh saved-*.pdf
やっぱり一旦 svg
で保存して rsvg-convert
したほうがいいかも
やはり,いったん svg
で保存して,rsvg-convert
で pdf にコンバートしたほうがファイルサイズも全然ちいさいので,よろしいかもしれない。
plt.plot(x, np.sin(x));
plt.savefig('saved-pltplot.svg')
%%bash
rsvg-convert -f pdf -o saved-pltplot2.pdf saved-pltplot.svg
p1 = plot(sin(t), (t, -2*pi, 2*pi));
p1.save('./saved-plot.svg')
%%bash
rsvg-convert -f pdf -o saved-plot2.pdf saved-plot.svg
%%bash
ls -lh saved-*.pdf
上記のように,rsvg-convert
でコンバートして作成した pdf のほうが圧倒的にファイルサイズが小さい。