HOWTO · Matplotlib
Matplotlib のラテックス公式
このチュートリアルでは、Matplotlib でどのようにして LaTex 式や方程式をレンダリングできるかを説明します。
このページの内容
Matplotlibでは、タイトル、軸ラベル、凡例、注釈に数式を組版できます。組み込みのmathtextは、別途TeXをインストールしなくても、多くの一般的な数式を表示できます。より幅広いLaTeX文書の組版が必要な場合は、text.usetexで外部レンダラーを有効にします。この方法には追加のシステム依存関係があります。特に記載がない限り、以下の例ではmathtextを使います。
Matplotlibで数式テキストを表示する
数式をドル記号で囲み、先頭にrを付けたPythonのraw文字列にすると、バックスラッシュが数式パーサーにそのまま渡されます。これは\sinなどのコマンドやギリシャ文字を使う場合に便利です。同じラベルの中で、数式の隣に通常のテキストを置くこともできます。mathtextは既定で有効で、分数、下付き文字、上付き文字、多くの記号など、一般的な表記に対応しています。ただし、すべてのLaTeXパッケージやコマンドを完全に実装しているわけではありません。
次の例では、y軸ラベルと凡例に数式を付けて正弦曲線を描画します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y, label=r"$\sin(x)$")
ax.set_xlabel("x")
ax.set_ylabel(r"$\sin(x)$")
ax.set_title("Sine curve with mathtext")
ax.legend()
fig.tight_layout()
plt.show()
この正弦曲線では、Matplotlib組み込みのmathtextを使っています。プロットのデータと数式ラベルは、上のコードで確認できます。
データは0から2πまでの1周期を表し、yの値はnp.sin(x)で求めます。raw文字列を使うと、\sinのバックスラッシュをそのまま保持できます。ドル記号はラベル内の数式部分を区切ります。これがないと、Matplotlibはテキストを通常の文字として扱います。数式が表示されない場合は、区切りのドル記号が対になっているか、各コマンドがmathtextに対応しているかを確認してください。
外部LaTeXレンダリングを有効にする
mathtextの対応範囲を超えるLaTeXの機能が必要な場合や、図のテキストを文書のTeX書体に合わせたい場合は、外部レンダリングを選びます。図を作成する前にtext.usetexを設定します。たとえば、plt.rcParams["text.usetex"] = Trueとすると、それ以降に作成する図で有効になります。mathtextに戻すには、値をFalseにします。描画コードを囲むplt.rc_context({"text.usetex": True})でも、同じように一時的な設定ができます。
外部レンダリングには、互換性のあるLaTeX環境と、Matplotlibが必要とする補助プログラムが必要です。これにはdvipngが含まれ、プラットフォームや出力方法によってはGhostscriptも必要です。使用するOSに対応したパッケージをインストールし、実行ファイルをPATHから見つけられるようにしてください。必要なパッケージや要件は、プラットフォームやMatplotlibの設定によって異なる場合があります。描画に失敗したら、エラーメッセージと、インストール済みバージョンのMatplotlibのドキュメントを確認してください。実行ファイルの不足、パッケージやコマンドへの非対応、TeXのコンパイルエラーなどにより、図のテキストを描画できないことがあります。一般的な数式を表示するだけなら、この設定を有効にする必要はありません。mathtextなら外部依存関係を避けられます。
依存関係と設定の詳細は、Matplotlibの公式ドキュメント「LaTeXを使ったテキストの書式設定」を参照してください。必要な補助プログラムは環境によって異なるため、プラットフォームや出力方法に関する条件も確認しましょう。
この設定が変えるのはMatplotlibによるテキストの描画方法であり、Pythonの文字列そのものではありません。数式はドル記号で囲み、raw文字列に記述してください。また、最終的な図を生成する環境で、代表的なラベルが正しく描画されるか確認してください。この記事では、特定バージョンのLaTeXやGhostscriptを前提としていません。
ギリシャ文字やその他の記号を使う
mathtextは、ドル記号で囲まれた範囲内のギリシャ文字コマンドと上付き文字の構文を認識します。たとえば、r"$\alpha^2$"はアルファの2乗を表示します。同じ書き方をラベルや凡例の項目にも使えます。数式ではない説明語は、ドル記号の外に置いてください。
次の例では、α、α²、α³を比較し、横軸にもαを使います。
このセクションのコードと表示されるラベルや出力は英語のままです。
import numpy as np
import matplotlib.pyplot as plt
alpha = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(alpha, alpha, label=r"$\alpha$")
ax.plot(alpha, alpha ** 2, label=r"$\alpha^2$")
ax.plot(alpha, alpha ** 3, label=r"$\alpha^3$")
ax.set_xlabel(r"$\alpha$")
ax.set_ylabel("Value")
ax.set_title("Greek letters and superscripts")
ax.legend()
fig.tight_layout()
plt.show()
凡例にはmathtextで3つのべき乗が表示されています。コードと曲線の値は上で確認できます。
Matplotlibのmathtextは一般的な記号を多く扱えますが、コマンドの種類はLaTeXを完全にインストールした環境とは異なります。コマンドが未対応の場合は、mathtextで使える表現に簡略化するか、必要な記法がLaTeXの機能に依存するときは外部レンダリングを使ってください。パーサーが数式と通常のラベル文字列を区別できるよう、数式全体を1組のドル記号で囲みます。
数式テキストを調整して注釈を追加する
ax.set_title、ax.set_xlabel、ax.set_ylabelなどにfontsize=14のような引数を渡すと、項目ごとに文字サイズを指定できます。図全体で一貫したスタイルにするには、plt.rcParamsからMatplotlibのfont.size、axes.titlesize、axes.labelsizeを設定します。たとえば、plt.rcParams["font.size"] = 12は基本の文字サイズを変更します。plt.rcParams["font.family"] = "serif"を指定すると、セリフ体のフォントを要求できます。利用できるフォントは環境によって異なり、外部LaTeXレンダリングには独自のフォント設定もあるため、最終的なサイズで図を確認してください。
ax.annotateを使うと、データ座標に注釈を置き、その点を指す矢印を付けることもできます。正弦曲線の最大値は、およそ(np.pi / 2, 1)にあります。この座標をxyに渡し、注釈を置く別の位置をxytextに指定して、arrowprops={"arrowstyle": "->"}で矢印を加えます。注釈には、たとえばr"Peak: $\sin(x)=1$"のように、通常の文章と数式を組み合わせられます。これにより、注釈を読みやすく保ちながら、説明する特徴と結び付けられます。
mathtextも外部LaTeXも図のテキストを描画する機能であり、元の数値データは変更しません。説明や単位はできるだけ通常のテキストにし、数式の区切りは記法に使い、凡例の数式は読みやすい長さにまとめてください。出版物の書体と正確に合わせる必要がある場合は、最終文書と同じフォント、レンダラー、出力形式を使って確認してください。