【Matplotlib】TeXのフォントで数式を表示する方法 (mathtext)

グラフ上に数式を表示する方法に悩んでいませんか?データの解釈やグラフの見やすさを向上させるために,数式を表示する必要があります

この記事では,Matplotlibのmathtext機能を使ってグラフ上に数式を表示する方法を詳しく解説します.これにより,数学的な関係性やパターンを直接グラフ上で示すことができます

また,数式フォントにTeXのフォントを使う方法も解説します

あなたはプロジェクトやレポートにおいて,数学的な概念や関数を視覚的に示すことで,より明確なコミュニケーションと洞察を得ることができます

目次

グラフ上に文字列を表示 (Axes.text)

数式をプロットエリア上に表示するには,Axes.textを使います

下記に引数と返値,公式ドキュメントのリンクを示します

Axes.text
引数
  • x, y (float) : テキストを配置するグラフの位置を座標で指定.座標系はtransformパラメータで変更可能
  • s (文字列) : 表示したいテキスト
  • fontdict (辞書) : テキストの色やフォントの設定をまとめて可能
返値
  • Text : テキストオブジェクトが作成されます
公式ドキュメント

プロットエリア上に数式を表示

数式は,4 + 2sin(2x)と4 + 2cos(2x)の2つの計算式としました

各数式を変数tex1とtex2に$で囲んだrow文字列として置き換えます

下記のタブにコードとフローチャートの解説をしています

import matplotlib.pyplot as plt
import numpy as np

# step1 データの作成
x = np.linspace(0, 10, 100)
y1 = 4 + 2 * np.sin(2 * x)
y2 = 4 + 2 * np.cos(2 * x)
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 Axes.plotによるグラフの描画
ax.plot(x, y1, linestyle=self.line_styles[0], label='Sample 1')
ax.plot(x, y2, linestyle=self.line_styles[1], label='Sample 2')
# step4 Axes.textによるテキストの表示
tex1 = r'$4+2{\rm sin}(2x)$'
tex2 = r'$4+2{\rm cos}(2x)$'
ax.text(0.2, 1, tex1, fontsize=20, va='bottom', color='C0')
ax.text(0.2, 0.2, tex2, fontsize=20, va='bottom', color='C1')
        
ax.set_xlim(0, 8)
ax.set_ylim(0, 8)
ax.set_xlabel('Time [sec]')
ax.set_ylabel('Frequency [Hz]')
ax.legend()

plt.show()

グラフタイトル,軸ラベルに数式を表示

グラフタイトル(ax.set_title)や軸ラベル(ax.set_xlabel, ax.set_ylabel)にも数式を表示してみます

$で囲んだrow文字列であればすべて数式と判定してくれます

# step4 Axes.textによるテキストの表示
tex1 = r'$4+2{\rm sin}(2x)$'
tex2 = r'$4+2{\rm cos}(2x)$'

ax.text(0.2, 1, tex1, fontsize=20, va='bottom', color='C0')
ax.text(0.2, 0.2, tex2, fontsize=20, va='bottom', color='C1')

# 軸ラベル
ax.set_xlabel('Time [sec]'r'$\Delta_i^j$')
ax.set_ylabel('Frequency [Hz]'r'$\Delta_i^j$')
# グラフタイトル
ax.set_title(r"$W^{3\beta}_{\delta_1 \rho_1} = "
r"U^{3\beta}_{\delta_1 \rho_1} + \frac{1}{8 \pi^{2}} $")

plt.show()

数式フォントのカスタマイズ

Matplotlibでの数式の入力は,row文字列$で囲むことで適用されます

また,Matplotlib はTeX をインストールする必要はありません.レイアウトエンジンは,Donald Knuth の TeX のレイアウトアルゴリズムをほぼそのまま採用しているため,品質はかなり良いです.

TeXなどの数式テキストの書式

通常のテキストとmathtextは同じ文字列の中で混在させることができます

本記事で取り上げる代表的なフォントを下記に紹介します

数式テキストのフォント
  • Computer Modern (おすすめ!):TeXに用いられるフォント
  • DejaVu Sans:Unicode用のラージフォントでデフォルトに設定されている
  • DejaVu Serif:DejaVu Sansフォントにセリフという小さな飾りがついたフォント
  • STIX フォント:Times とブレンド可能なフォント

下記のタブにコードとフローチャートの解説をしています

# step1 データの作成
x = np.linspace(0, 10, 100)
y1 = 4 + 2 * np.sin(2 * x)
y2 = 4 + 2 * np.cos(2 * x)
y3 = 6 + 2 * np.sin(2 * x)
y4 = 6 + 2 * np.cos(x)
# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 Axes.plotによるグラフの描画
ax.plot(x, y1, linestyle=self.line_styles[0])
ax.plot(x, y2, linestyle=self.line_styles[1])
ax.plot(x, y3, linestyle=self.line_styles[2])
ax.plot(x, y4, linestyle=self.line_styles[3])
# step4 Axes.textによるテキストの表示
tex1 = r'Computer Modern. $Computer Modern. 4+2{\rm sin}(2x)$'
tex2 = r'Dejavu Sans. $Dejavu Sans. 4+2{\rm cos}(2x)$'
tex3 = r'Dejavu Serif. $Dejavu Serif. 6+2{\rm sin}(2x)$'
tex4 = r'Stix Sans. $Stix Sans. 6+2{\rm cos}(x)$'

ax.text(0.2, 0.2, tex1, color='C0', math_fontfamily='cm', size=16)
ax.text(0.2, -1, tex2, color='C1', math_fontfamily='dejavusans', size=16)
ax.text(0.2, -2.2, tex3, color='C2', math_fontfamily='dejavuserif', size=16)
ax.text(0.2, -3.4, tex4, color='C3', math_fontfamily='stixsans', size=16)
    
plt.show()

rcPramsを使ってTeXのフォントをデフォルトにする

mathtextフォントは,カスタマイズ変数 mathtext.fontset で選択できます

plt.rcParams[‘mathtext.fontset’]で,mathtextのフォントを設定します

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['mathtext.fontset'] = 'cm'

数式表示のデモ

数式は様々ありますが,よく使われる数式の表示方法を解説します

数式表示
  • 下付き文字 : アンダースコア “_”
  • 上付き文字 : キャレット “^”
  • 分数 : \frac{分子}{分母}
  • 平方根 : \sqrt

下付き文字と上付き文字

下付き文字はアンダースコア “_” ,上付き文字はキャレット “^” を使います

2文字以上の文字がある場合は,{}で一つの塊とできます

fig, ax = plt.subplots()

subscripts_superscripts = [
    'alpha > beta', 
    r'$\alpha > \beta$', 
    r'$\alpha^{ic} > \beta_{ic}$', 
    r'$\sum_{i=0}^\infty x_i$'
]

for i, tex in enumerate(subscripts_superscripts):
    ax.text(0.5, i*1.5+2, tex, size=18)

plt.show()

分数

分数には\frac{分子}{分母}を使います

分数に似た表現で,2項式積み上げ数があり,それぞれ\binom{}{}\genfrac{}{}{}{}{}{}で表示します

分数の括弧は\left\rightを使って,式全体を括弧する必要があります

fig, ax = plt.subplots()

fractions = [
    r'$\frac{3}{4} \binom{3}{4} \genfrac{}{}{0}{}{3}{4}$',
    r'$\frac{5 - \frac{1}{x}}{4}$',
    r'$(\frac{5 - \frac{1}{x}}{4})$',
    r'$\left(\frac{5 - \frac{1}{x}}{4}\right)$'
]

for i, tex in enumerate(fractions):
    ax.text(0.5, i*1.5+2, tex, size=18)
    
plt.show()

平方根

平方根は\sqrtを使います

平方根における乗数の指定は,[]により入力できます

fig, ax = plt.subplots()

radicals = [
    r'$\sqrt{2}$',
    r'$\sqrt[3]{x}$'
]

for i, tex in enumerate(radicals):
    ax.text(0.5, i*1.5+2, tex, size=18)
    
plt.show()

参考文献

Axes.text関数

数式テキストのデモンストレーション

数式の表現方法のまとめ

お疲れ様でした

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次