グラフ上に数式を表示する方法に悩んでいませんか?データの解釈やグラフの見やすさを向上させるために,数式を表示する必要があります
この記事では,Matplotlibのmathtext機能を使ってグラフ上に数式を表示する方法を詳しく解説します.これにより,数学的な関係性やパターンを直接グラフ上で示すことができます
また,数式フォントにTeXのフォントを使う方法も解説します
あなたはプロジェクトやレポートにおいて,数学的な概念や関数を視覚的に示すことで,より明確なコミュニケーションと洞察を得ることができます
グラフ上に文字列を表示 (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{}{}{}{}{}{}で表示します
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関数
数式テキストのデモンストレーション
数式の表現方法のまとめ
お疲れ様でした
コメント