Matploblibでよくやるけどよく忘れることまとめ

前提

import matplotlib as mpl
import matplotlib.pyplot as plt

# 特に断りがなければ以下も使用する
fig = plt.figure()
ax = fig.add_subplot(111)

Adobeで編集できるようにする

1. TrueTypeのフォントタイプを使う

デフォルトは3で、Output Typeらしい。この辺に詳しい。

mpl.rcParams['pdf.fonttype'] = 42
mpl.rcParams['ps.fonttype'] = 42

2. pgf backendを使う

LATEXの処理系を使う。

plt.savefig("test.pdf", backend="pgf")

カスタムフォントを利用する

WSLなら/mnt/c/Windows/FontsとかにWindows側のフォントがあって、使いたいことがよくある。

import matplotlib.font_manager as font_manager

fontpaths = ["/mnt/c/Windows/Fonts"]

font_files = font_manager.findSystemFonts(fontpaths=fontpaths)
for font_file in font_files:
    font_manager.fontManager.addfont(font_file)

plt.rcParams["font.family"] = "Arial"

使えるフォント一覧を見る

import matplotlib.font_manager as font_manager

print(font_manager.fontManager.ttflist)

余白を制御する

長いラベルとかのときに、余白を制御しときたいことが多い。

# left, right, top, bottom
plt.rcParams['figure.subplot.left'] = 0.75

ColorbarのみのPlot

mpl.colorbar.Colorbarを利用する。ColorbarBaseは最近非推奨。

cmap = plt.get_cmap("gnuplot")
norm = mpl.colors.Normalize(vmin=0, vmax=10)

cbar = fig.add_subplot(111)
mpl.colorbar.Colorbar(
    cbar,
    mappable=mpl.cm.ScalarMappable(norm=norm, cmap=cmap),
    orientation="vertical",
).set_label("label", fontsize=20)

mpl.colors.Normalizeplt.get_cmapの返り値はCallableなので、正規化された値や、その値に対応したいいろが欲しい場合は、以下のように取得できる。

value = 5
color = cmap(norm(value))

図形を書く

patchを使う

import matplotlib.patch as patch

# 長方形
ax.add_patch(patch.Rectangle(xy=(0, 0), width=10, height=10))
# 枠と内部を同じ色 (blue)
ax.add_patch(patch.Rectangle(xy=(0, 0), width=10, height=10, color="blue"))
# 枠 (black) と内部 (blue) を違う色
ax.add_patch(patch.Rectangle(xy=(0, 0), width=10, height=10, edgecolor="black", facecolor="blue"))

tickのラベルと位置を調整する

ax = fig.add_subplot(111, xticks=[0, 0.25, 0.75, 1], xticklabels=["", "A", "B", ""])

Sizeを表すレジェンドを独立して取り出したい

普通はそのままでいいんですが、例えば散布図の点の大きさを調整したりすると、ラベルの調整が必要になります。そういうときにLabelを取り出して書き直すとかするときに便利です。

actual_size = [0.01, 0.02, 0.03]
ax.scatter([1, 1, 1], [2, 2, 2], s=[s * 10 for s in actual_size])

handles, labels = ax.get_legend_handles_labels(prop="sizes", alpha=0.5)
legend = ax.legend(
    handles,
    labels,
    title="size",
    title_fontsize=15,
    markerscale=0.4
)

Subplot感覚のいい感じな調整

tight_layoutを使う。

fig = plt.figure()
ax1 = fig.add_subplot(112)
ax2 = fig.add_subplot(212)
fig.tight_layout()

この記事に関するIssueをGithubで作成する

Read Next