5.

Matplotlib タイトルと軸ラベル完全ガイド|フォント・TeX 数式・日本語化

編集
この記事の要点
  • Matplotlib のタイトルと軸ラベルplt.title() / plt.xlabel() / plt.ylabel()。OO スタイルでは ax.set_title() / ax.set_xlabel()
  • フォントサイズ・色・太字などは fontsize= / color= / fontweight= / fontstyle= で個別指定
  • figure 全体のタイトルは fig.suptitle()。複数 subplot を横断する大見出しに使う
  • TeX 数式は raw 文字列 + $…$ で記述: r'$\alpha + \beta = \gamma$'rcParams['text.usetex']=True で本物の LaTeX も
  • 日本語化rcParams['font.family'] = 'Hiragino Sans' 等のフォント指定、または japanize-matplotlib パッケージが定番

タイトル・軸ラベルの基本

グラフの「何を描いているか」「軸の単位は何か」を伝える要素。これが無いグラフはレポートとして致命的です。

Matplotlib タイトルと軸ラベルの例

最小コード

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 5, 3]

plt.plot(x, y, marker='o')

plt.title('Sample Title')
plt.xlabel('X axis label')
plt.ylabel('Y axis label')

plt.show()

主なオプション

引数意味
fontsize文字サイズ (ポイント or 名前)18 / 'x-large'
fontweight太さ'normal' / 'bold' / 'light'
fontstyleスタイル'normal' / 'italic' / 'oblique'
color文字色'red' / '#336699'
fontnameフォント名'Arial' / 'Hiragino Sans'
locタイトル位置 (title 専用)'left' / 'center' / 'right'
pad軸との余白 (ポイント)pad=15
labelpad軸ラベルと軸の距離labelpad=10

スタイル指定例

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 5, 3]

plt.plot(x, y, marker='o')

plt.title('Sales Trend',
          fontsize=20, fontweight='bold', color='navy',
          loc='left', pad=15)

plt.xlabel('Month', fontsize=14, color='gray', labelpad=10)
plt.ylabel('Sales (M yen)', fontsize=14, color='gray', labelpad=10)

plt.tight_layout()
plt.show()

OO スタイル (Axes API)

複数 subplot を扱う場面では Axes オブジェクト経由が推奨です。

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(1, 2, figsize=(10, 4))

x = np.linspace(0, 10, 100)
axes[0].plot(x, np.sin(x))
axes[0].set_title('sin(x)')
axes[0].set_xlabel('x')
axes[0].set_ylabel('sin(x)')

axes[1].plot(x, np.cos(x), color='orange')
axes[1].set_title('cos(x)')
axes[1].set_xlabel('x')
axes[1].set_ylabel('cos(x)')

# Figure 全体のタイトル
fig.suptitle('Trigonometric Functions', fontsize=16, fontweight='bold')

plt.tight_layout()
plt.show()

TeX 数式の埋め込み

Matplotlib は軽量な数式パーサ (mathtext) を持ち、ドル記号で囲むだけで数式を描けます。文字列は raw 文字列にして \\ エスケープを避けるのが定石。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 100)
plt.plot(x, np.sin(x))

plt.title(r'$y = \sin(x)$ for $x \in [0, 2\pi]$', fontsize=16)
plt.xlabel(r'$x$ (rad)', fontsize=14)
plt.ylabel(r'$\sin(x)$', fontsize=14)

# よく使う数式
# r'$\alpha$ $\beta$ $\gamma$ $\Delta$ $\pi$'
# r'$\frac{a}{b}$ $\sqrt{x}$ $x^2$ $x_{i+1}$'
# r'$\sum_{i=0}^{N} x_i$ $\int_0^\infty e^{-x} dx$'

plt.show()

本物の LaTeX エンジンを使いたければ:

import matplotlib as mpl
mpl.rcParams['text.usetex'] = True
mpl.rcParams['font.family'] = 'serif'
# 要: 環境に LaTeX (texlive 等) インストール済

日本語化

Matplotlib のデフォルトフォントは日本語を持たず、軸ラベルに「平均」など書くと □□□ (豆腐文字) になります。対処は 3 通り。

方法 A: japanize-matplotlib (一番楽)

pip install japanize-matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib  # noqa: F401   import するだけで日本語化

plt.plot([1, 2, 3], [1, 4, 9])
plt.title('日本語タイトル')
plt.xlabel('横軸')
plt.ylabel('縦軸')
plt.show()

方法 B: rcParams でフォント指定

import matplotlib.pyplot as plt
import matplotlib as mpl

# OS に応じて利用可能なフォントを指定
# Windows: 'Yu Gothic' / 'Meiryo' / 'MS Gothic'
# macOS  : 'Hiragino Sans' / 'Hiragino Maru Gothic Pro'
# Linux  : 'Noto Sans CJK JP' / 'IPAexGothic'
mpl.rcParams['font.family'] = 'Hiragino Sans'

plt.title('日本語タイトル')
plt.show()

方法 C: 個別に fontname 指定

plt.title('日本語タイトル', fontname='Yu Gothic')
plt.xlabel('横軸', fontname='Yu Gothic')
plt.ylabel('縦軸', fontname='Yu Gothic')

マイナス記号の文字化け対策

方法 B で日本語フォントを指定すると、軸の -1.0 等のマイナス記号が 豆腐になることがあります。axes.unicode_minus を False に。

import matplotlib as mpl
mpl.rcParams['font.family'] = 'Yu Gothic'
mpl.rcParams['axes.unicode_minus'] = False   # ハイフン (-) を使う

軸目盛とラベルの違い

要素関数
タイトルtitle「2024 年売上推移」
軸ラベルxlabel / ylabel「月」「売上 (万円)」
目盛り値xticks / yticks1, 2, 3, ... の位置と表示
目盛りラベルset_xticklabels「1月」「2月」 (位置 1, 2 に対応)
凡例legend系列ごとの説明

位置と整列

import matplotlib.pyplot as plt

x = [1, 2, 3]
y = [1, 4, 9]

# タイトルを左寄せ + 上に余白
plt.plot(x, y)
plt.title('Left title', loc='left', pad=20)

# x 軸ラベルを軸下に近く
plt.xlabel('X', labelpad=2)

# y 軸ラベルを回転
plt.ylabel('Y value', rotation=0, labelpad=30, ha='right')

plt.show()

全体に共通スタイルを当てる (rcParams)

import matplotlib as mpl

mpl.rcParams.update({
    'axes.titlesize': 16,
    'axes.titleweight': 'bold',
    'axes.labelsize': 13,
    'axes.labelweight': 'normal',
    'axes.labelcolor': '#333333',
    'axes.titlepad': 15,
    'axes.labelpad': 8,
})

# 以降の plt.title / plt.xlabel に自動適用

FAQ

Q: タイトルがグラフに重なって読めない
A: plt.tight_layout() または plt.subplots_adjust(top=0.85) で上部余白を増やします。fig.suptitle 使用時は tight_layout(rect=[0,0,1,0.95])

Q: 数式の \\alpha がそのまま文字列として表示される
A: raw 文字列 (r'') + ドル記号で囲む必要があります: r'$\\alpha$'

Q: subplot ごとに別フォントを使いたい
A: ax.set_title('A', fontname='Arial') のように Axes 単位で指定。rcParams を変えても以降だけに効きます。

Q: 軸ラベルを 2 段にしたい
A: 改行文字 \\n を入れれば 2 行表示: plt.xlabel('時刻\\n(2024 年 1 月)')

Q: タイトルに変数を埋め込みたい
A: f 文字列で plt.title(f'Mean = {mean:.2f}')。数式と組み合わせる場合は f'$\\\\mu = {mean:.2f}$' でエスケープに注意。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 線グラフ
  2. 棒グラフ
  3. 円グラフ
  4. 散布図
  5. タイトルと軸のラベル
  6. グリッド線

最近更新/作成されたページ