私の備忘録がないわね...私の...

画像処理とかプログラミングのお話。

matplotlibで日本語とLaTeX(LuaTeX)を共存させる

TL;DR

apt-get update
apt-get install -y \
texlive \
texlive-latex-extra \
texlive-fonts-recommended \
dvipng \
cm-super

apt update
apt install -y \
texlive-luatex \
texlive-lang-japanese
import matplotlib as mpl
import matplotlib.pyplot as plt
import japanize_matplotlib

mpl.use('pgf')
plt.rcParams['text.usetex'] = True
plt.rcParams['pgf.texsystem'] = 'lualatex'

詳細な手順

matplotlib上で日本語とLaTeXを同時に使う方法を書き残します. 厳密にはLuaTexです. 後述の通り, PGFバックエンドを用いるので, plt.show()などで期待されるインタラクティブな画像表示は機能しません. 画像を保存するだけで十分な方に向けた記事です.

各versionは以下の通りです.

  • Python 3.8.13
  • matplotlib 3.6.2
  • japanize-matplotlib 1.1.3

LaTeX環境は以下のように構築されています.

apt-get install texlive texlive-latex-extra texlive-fonts-recommended dvipng cm-super
pip3 install latex

matplotlibで日本語を使う方法にjapanize-matplotlibがあります. これは以下のようなコードを実行する分には何の問題もありません。

import matplotlib.pyplot as plt
import japanize_matplotlib

plt.title('タイトル')
plt.show()

しかし以下のようにLaTeXと同時に使おうとするとエラーが起きます. これは特殊な設定をしないとLaTeXで日本語が使えないことに由来します.

import matplotlib.pyplot as plt
import japanize_matplotlib

plt.rcParams['text.usetex'] = True
plt.title('タイトル')
plt.show()
RuntimeError: latex was not able to process the following string:
b'\\u30bf\\u30a4\\u30c8\\u30eb'
...
! Package inputenc Error: Unicode character タ (U+30BF)
(inputenc)                not set up for use with LaTeX.
...
l.29 {\rmfamily タ
                   イトル}%

これは, 基本的にLaTeXで日本語を使えるようにすれば解消されます. ここでは一例としてLuaTeXtexlive-lang-japaneseを使う方法を示します.

texlive-luatextexlive-lang-japaneseをインストールします.

apt update
apt install -y texlive-luatex texlive-lang-japanese

コードは以下のように変更します.

import matplotlib as mpl
import matplotlib.pyplot as plt
import japanize_matplotlib

mpl.use('pgf')
plt.rcParams['text.usetex'] = True
plt.rcParams['pgf.texsystem'] = 'lualatex'
plt.title('タイトル')
# plt.show()
plt.savefig('title.pdf')

PGFバックエンドを用いるので, plt.show()などで期待されるインタラクティブな画像表示は機能しません.