18
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

科学技術論文に用いる図表のための matplotlib 設定

Posted at

TL; DR

現実

  • 何も考えずに デフォルト設定のまま プロット
  • フォントサイズや線の太さなどを 場当たり的に 設定
    • 膨れ上がるオプション… plt.plot(x, y, markersize=16, fontsize=24, linewidth=2, xlabel="Time", ...)
  • 完成した図を 拡大・縮小 して載せるせいでバランスが崩壊
  • 論文と発表スライドで 同じ図を流用 するために本文のフォントサイズとのバランスが崩壊

理想

  1. 図を載せる媒体の 大きさを調べる
  2. その媒体に適した大きさの図を 設計 する

背景

論文執筆,研究発表において実験を視覚的に伝えるために図は非常に有用です.
しかし,図の大きさやフォントサイズのバランスが崩れているために伝わりづらくなっている残念な図を非常によく見かけます.
その原因は 大きさを意識していない からであると一言で言えます.
大きさとは論文・スライドに載せる図の大きさと,それを載せる対象である媒体の大きさの両方が含まれます.

よく見る残念な例

ここでは研究のプレゼンテーション資料を Microsoft Powerpoint (以下,パワポ)で作成し,実験結果の図を matplotlib で作成することを想定し,デフォルトではなぜいけないのかを説明します.
まずは matplotlib のデフォルトをそのまま使うとどうなるかを確認しましょう.
次の図はデフォルトの図をそのままパワポの 16:9 スライドのデフォルトサイズのスライドに載せた場合です.
examples0.png
図中のグラフの赤い枠線は matplotlib が出力する図全体の大きさをみやすくするためにつけています.
図全体の大きさはちょうどよいですが,図中のフォントサイズがとても小さいことがわかります.
それもそのはず,matplotlib のデフォルトのフォントサイズは 10 pt だからです.
論文であればフォントサイズが 10 pt 前後なのでこのくらいでもいいですが,プレゼンテーション資料には向きません.
しかし論文に使った図をプレゼンテーション資料に使い回したなどの理由で,このようなバランスの悪いスライドはかなり多く見られます.

ではこの資料を見た共著者から「字が小さいから作り直してくれ!」というコメントを受けたとしましょう.
場当たり的に fontsize=24 というオプションを plt.xlabelplt.title の各種メソッドに追加して作り直した図をパワポにそのまま挿入するとこうなります.
examples1.png
図を全体的に大きくしているので当然このような結果になるでしょう.
そして多くの人はこの図を拡大縮小してスライドの大きさに合わせます.
すると今度はこうなります.
examples2.pngせっかくフォントサイズを大きくしたのに図を全体的に縮小してしまっています.
最初のページと見比べてみてください,結局あまり変わっていません.
図を全体的に大きくしたのが間違いだったようです.

ではパワポ内で拡大縮小することをやめてみるとどうなるでしょうか.
matplotlib 側で描画領域の大きさを調整する必要があります.
matplotlib には tight_layout() というメソッドがありますので,それを使って軸ラベルなどを描画領域におさまるようにしてみましょう.
examples3.png
まだ余白が大き過ぎますね.
これは matplotlib 内で tight_layout() を呼び出した時の余白の設定があるからです.
これを少し調整しましょう.
examples4.png
ずいぶんましになりました.

バランスのとれた図の作り方

以下では研究のための図を作成するために役立つ一般的な方法を共有します.
その方法は 図の大きさを意識する だけです.
とても簡単なことですが,簡単すぎて多くの人が見過ごしています.

ここではパワポに載せる図を例に,パワポで図を拡大縮小することなく何も調整しない状態で狙った大きさになるような図の作り方を説明します.
まずは図を載せる媒体の大きさを調べます.
これがわからなくては,図をどれくらいのバランスで描くべきか検討がつきません.
examples5.png
パワポであれば,スライド全体の大きさは「デザイン」タブの「スライドのサイズ」で確認できます.
次に載せたい図を大きさを決めます.
examples6.png
この例では幅をスライド 6 割くらい,アスペクト比を黄金比になるようにしてみました.
パワポであれば適当に四角形を描いてみて,「図の書式設定」で大きさを確認できます.
この大きさをメモしておきます.
ついでに,パワポのスライド内のフォントサイズも調べておきましょう.
このスライドでは本文のフォントサイズは 28 pt でした.
適切に設定すれば次のようになります.
examples8.png
図の拡大縮小はもはや必要ありません.
LaTeX で \includegraphics[width=\linewidth]{example.pdf} などもってのほかです.

ここまでの説明はパワポでのプレゼンテーションに限らず,論文,書籍,ポスター発表,口頭発表などあらゆる媒体で使える方法論です.
例えば,論文によく用いられている A4 用紙は横 210mm 縦 297mm です.
A4 2 段組み論文のほとんどが左右に 15mm 程度の余白があるため,実際に有効な幅は 90mm 程度であることを考えると matplotlib のデフォルトである 縦 121.92 mm,横 162.56 mm は大きすぎることがわかります.
デフォルトを信じてはいけないのです 1
筆者は A4 2 段組論文では横 90 mm,縦 54mm とし,フォントサイズは 9 pt になるように設定しています.
図をソフト側で拡大縮小していじるのではなく,元の図を書くソフトの方を調整することを心がけましょう.

matplotlibrc の設定

figsizefontsize といったパラメータを plt.plot(x, y) のオプションで毎回指定するのは骨が折れます.
これらの設定は matplotlibrc にまとめられています.
matplotlibrc の設定を Python コード内で書き換えるには

  • Python コード内で設定する
  • matplotlibrc 設定ファイルを配置する

ことで対応できます.

sample.py
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['lines.linewidth'] = 2
plt.rcParams['lines.linestyle'] = '--'
data = np.random.randn(50)
plt.plot(data)

上記コードと同じディレクトリに matplotlibrc というファイルを作り

lines.linewidth: 1.5
lines.linestyle: --

というテキストファイルを作成し

sample.py
import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(50)
plt.plot(data)

を実行すれば同じ結果が得られます.
自分で好きな設定ファイルを作成し,適当なディレクトリに配置して python コード内から呼び出すこともできます 2

matplotlib 内でデフォルトので設計されている様々なスタイル は,内部的に異なる matplotlibrc ファイルを作成しそれを読み込むことで実現されています.
詳しくは 公式ページ を参照してください.

参考文献

matplotlib

プレゼンテーション

  1. https://speakerdeck.com/eitanlees/visualization?slide=75

  2. https://matplotlib.org/stable/users/explain/customizing.html#defining-your-own-style

18
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?