ここでは指数分布の確率密度関数のグラフを Matplotlib で作成し,凡例や軸ラベルに LaTeX の数式を利用すること考えます.さらに,LaTeX 文書と同じフォントをグラフにも利用することで,文書全体でフォントの統一を図ることも考えます.
まず最低限のライブラリを読み込みます.
ライブラリの読み込み
import matplotlib.pyplot as plt
import numpy as np
次に x 軸の値を NumPy 配列として作成します.
x_min = 0; x_max = 10; x_step = 0.1
x = np.arange(x_min, x_max + x_step, x_step)
print(x)
[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 ...(中略)... 8.4 8.5 8.6 8.7 8.8 8.9 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 10. ]
パラメータ \(\lambda\) の指数分布について確率密度関数 \begin{equation} f(x) = \lambda e^{-\lambda x} \end{equation} の値を準備します.
# 指数分布のパラメータ
lam = 0.5
# 指数分布の確率密度関数
y = lam * np.exp(- lam * x)
print(y)
[0.5 0.47561471 0.45241871 0.43035399 0.40936538 0.38940039 0.37040911 0.35234404 0.33516002 0.31881408 0.30326533 0.28847491 ...(中略)... 0.0055545 0.0052836 0.00502592 0.0047808 0.00454764 0.00432585 0.00411487 0.00391419 0.00372329 0.0035417 0.00336897]
値の準備ができたので,折れ線グラフとして密度関数のグラフを作成します.このとき,r"文字列" のように Python の raw 文字列を利用して文字列全体を r"" で囲います.さらに文字列の中において LaTeX のルールで数式を $$ で囲って入力します.
fig, ax = plt.subplots(1, 1, figsize=(6, 4))
ax.plot(x, y, label=r"$\lambda = 0.5$") # TeX の数式(記号)が使える
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"probability density function : $f(x)$")
ax.set_xlim(0, x_max) # x軸の範囲を設定
ax.set_ylim(ymin=0) # y軸の下限だけを設定
ax.legend() # 凡例
ax.set_title('Exponential Distribution')
plt.savefig('exp_dens1.png', dpi=300)
出力されたグラフでは凡例にギリシア文字の \(\lambda\) が表示されたと共に,横・縦の軸ラベルで x と f(x) が斜体になっていることが分かります.
文書にグラフを貼り付けたときに,グラフ中に用いられている文字サイズが本文中の文字サイズと同じ程度の大きさになるように調整することがよくあります.したがって,ここではグラフ中の文字サイズを大きくし,線の太さを太くすることを考えます.このために,文字サイズを大きくするのではなく,グラフ全体のサイズを小さくすることで,相対的に文字を大きくし,線を太くする方法を採用することも一つの選択肢になります.
ここでは,次のとおり figsize=(6, 4) を figsize=(3, 2) に変更してみました.
fig, ax = plt.subplots(1, 1, figsize=(3, 2))
ax.plot(x, y, label=r"$\lambda = 0.5$") # TeX の数式(記号)が使える
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"probability density function : $f(x)$")
ax.set_xlim(0, x_max) # x軸の範囲を設定
ax.set_ylim(ymin=0) # y軸の下限だけを設定
ax.legend() # 凡例
ax.set_title('Exponential Distribution')
plt.savefig('exp_dens2.png', dpi=450)
これによって相対的に文字のサイズが大きくなり,グラフの線も太くなりました.しかしながら,軸ラベルが消えてしまいました.これは,バウンディングボックスに関係する問題です.この現象は pdf 形式で出力し,Adobe Illustrator で表示すると,軸ラベルが画像(バウンディングボックス)の外側に配置されていることが確認できます.
この問題を回避するためには,次のとおり bbox_inches="tight" というオプションを指定すると良いでしょう.
fig, ax = plt.subplots(1, 1, figsize=(3, 2))
ax.plot(x, y, label=r"$\lambda = 0.5$") # TeX の数式(記号)が使える
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"probability density function : $f(x)$")
ax.set_xlim(0, x_max) # x軸の範囲を設定
ax.set_ylim(ymin=0) # y軸の下限だけを設定
ax.legend() # 凡例
ax.set_title('Exponential Distribution')
plt.savefig('exp_dens3.png', dpi=450, bbox_inches="tight")
これによって軸ラベルも再び表示されるようになりました.
利用している PC に LaTeX の環境がインストールされていれば,Matplotlib のグラフに LaTeX のフォントで数式などを埋め込むことができるようになります.具体的には次のとおり,plt.rcParams["text.usetex"] = True を実行してからグラフを作成します.
plt.rcParams["text.usetex"] = True # TeX と同じフォントを使う
fig, ax = plt.subplots(1, 1, figsize=(3, 2))
ax.plot(x, y, label=r"$\lambda = 0.5$") # TeX の数式(記号)が使える
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"probability density function : $f(x)$")
ax.set_xlim(0, x_max) # x軸の範囲を設定
ax.set_ylim(ymin=0) # y軸の下限だけを設定
ax.legend() # 凡例
ax.set_title('Exponential Distribution')
plt.savefig('exp_dens4.png', dpi=450, bbox_inches="tight")
これにより,凡例や軸ラベルの数式に LaTeX と同じフォントが利用されるようになりました.また,軸の数値についても同時に LaTeX と同じフォントになっていることにも注意してください.一方でタイトルや軸ラベルの文字列についてはボールドフォントのままです.次はこれらも LaTeX と同じフォントにしてみましょう.
最後に,タイトルや軸ラベルの文字列にも LaTeX と同じフォントを利用することで,LaTeX 文書にグラフを貼り付けたときに統一感が向上するようにしましょう.具体的には plt.rcParams["font.family"] = "serif" を実行してからグラフを作成します.
plt.rcParams["text.usetex"] = True # TeX と同じフォントを使う
plt.rcParams["font.family"] = "serif" # タイトルなどの文字列もTeXフォントにする
fig, ax = plt.subplots(1, 1, figsize=(3, 2))
ax.plot(x, y, label=r"$\lambda = 0.5$") # TeX の数式(記号)が使える
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"probability density function : $f(x)$")
ax.set_xlim(0, x_max) # x軸の範囲を設定
ax.set_ylim(ymin=0) # y軸の下限だけを設定
ax.legend() # 凡例
ax.set_title('Exponential Distribution')
plt.savefig('exponential_dens_3.png', dpi=450, bbox_inches="tight")
これによりグラフ中に登場する文字列,数式が全て LaTeX と同じフォントになりました.