俺言語。

自分にしか理解できない言語で書かれた備忘録

【論文】Matplotlibでのグラフ出力 トラブル&解決方法

Matplotlibで論文用のグラフを出力した際に起こったトラブルと解決方法覚え書き

1. epsで出力した画像がLaTex上でうまく表示されない (グラフが画像の枠からはみ出る)

これはmatplotlibがepsを出力する際のbouding box値にバグがあるためらしく、下記のサイトでは一度PDFに変換して再度epsに戻すことで解決していました。
自分の環境では、epsをpdfに変換するのがうまくいかず断念。
結局は LaTexに直接貼るものはpdfで出力することにしました.
ami-gs.hatenablog.com

2. Matplotlibから出力したpdfをLaTexに貼ると、no BoundingBoxとエラーが出る

matplotlibから出力されたpdfをそのままLaTexに貼ろうとすると今度は"no BoundingBox"とエラーが出ました。
これは,LaTexの画像挿入のところで、bbを定義してあげると解決しました。

\includegraphics[bb=0 0 404 295, scale=0.6]

bbの値はLaTexに付属のextractbbコマンドを使うことで入手できる。
画像があるフォルダと同階層で,コマンドプロンプトから

extractbb img.pdf

と入力するとそのフォルダに.xbbファイルが生成され、その中にbb値が存在する.
www.ic.daito.ac.jp

3. matplotlibから出力されたeps、pdfをInkScapeにインポートするとフォントが変わってしまう

matplotlibでは、New Times Romanに設定したグラフがInkScapeにインポートするとSanSerifになってしまう事象がありました。
InkScape上で全て手作業でフォントを直すのはかなり大変なため,matplotlibから出力されるpdfのフォントを埋め込みではなくアウトライン化することで対応。
但し、InkScapeで編集するときに重くなるので注意が必要。
アウトライン化の方法は、

  1. matplotlib.patheffectsをインポート
  2. アウトライン化したいtextオブジェクトを取得
  3. そのtextオブジェクトのset_path_effectsメソッドを引数path_effects.Normal()で実行
import matplotlib.patheffects as path_effects

tx = ax.get_xaxis().get_label()
tx.set_path_effects([path_effects.Normal()])

matplotlib.org