6.03.2022

matplotlibの数式でボールドかつイタリックにする方法

matplotlibで軸ラベルとか凡例とかで数式を書きたいことは多い。

単に$$で囲えば数式になってくれるし、デフォルトのサンセリフでかっこ悪いならmatplotlibrcでセリフを指定すれば解決する(過去記事)。

ベクトルを書くときには\mathbf{x}とかしないといけないが、そうすると立体のボールドになる。

変数扱いのシンボルならベクトルでも斜体がいいなと思うので、調べたらようやく解決方法が見つかった。参考はこちら。公式サイトにも説明がある。

使ったmatplotlibバージョンは3.5.1。

要するにLaTeXを直接使ってレンダリングするみたい。そうすればプリアンブルでパッケージを指定する方法が通常LaTeXと同様に使える。

そのためにはmatplotlibrcファイルに以下の2行を追加して保存。

text.usetex: True
text.latex.preamble: \usepackage{amsmath} \usepackage{amssymb} \usepackage{physics} \usepackage{bm}

プリアンブルの部分はお好みでかけて、自作のコマンド\newcommand{\xxx}{\yyy}とかも書けるみたい。

ところで失敗例としては、ググったらPythonの本文中で

matplotlib.rc('text', usetex=True)
matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"]

と書くと良いとかいうのを見かけた(これとかこれ)けど、実行すると

MatplotlibDeprecationWarning: Support for setting an rcParam that expects a str value to a non-str value is deprecated since 3.5 and support will be removed two minor releases later.

とエラーが出る。新しいバージョンでは使えないということなのだろう。matplotlibrcに書くしかないのかもしれない。

なお$\bm{xxx}$をPythonで記述するときは注意が必要で、\bがバックスペースのASCIIに割り当てられているので数式として認識させたい場合にはr'$\bm{xxx}$'とか'$\\bm{xxx}$'とかしないとエラーが出る。

長年できなかったので実現して嬉しいー!

(追記)
これで解決はしたけど、TeXレンダリングが重すぎるのか、描画がものすごく遅くなった。インタラクティブな画面でぐりぐりするのも許容しがたいほど遅い。通常時はusetexとかはしない方が良さそう…面倒だけど必要なときのみmatplotlibrcからいじるしかないかもしれない。

0 件のコメント:

コメントを投稿