前提

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()

記事に間違い等ありましたら、お気軽に以下までご連絡ください

E-mail: illumination.k.27|gmail.com ("|" replaced to "@")

Twitter: @illuminationK

当HPを応援してくれる方は下のリンクからお布施をいただけると非常に励みになります。

Ofuse

Other Articles

Privacy Policy

Copyright © illumination-k 2020-2022.