Pynote

Python、機械学習、画像処理について

matplotlib - テキストの設定項目 まとめ

テキストの透過度を設定する。

alpha で透過度を [0, 1] の float で指定できる。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = np.linspace(1, 0, 5)
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.15
    text = "alpha='{:.1f}'".format(p)
    ax.text(x, y, text, alpha=p, fontsize=16)

plt.show()


テキストの背景色を設定する。

backgroundcolor でテキストの背景色を指定できる。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = [None, 'none', 'red', 'blue', 'green']
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.15
    text = "backgroundcolor='{}'".format(p)
    ax.text(x, y, text, backgroundcolor=p, fontsize=16)

plt.show()


テキストの色を設定する。

color でテキストの色を指定できる。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['red', 'blue', 'green', '#001267', (0.8, 0.8, 0)]
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.15
    text = "color='{}'".format(p)
    ax.text(x, y, text, color=p, fontsize=16)

plt.show()


フォント関係

フォントの一覧を確認する。

https://matplotlib.org/api/font_manager_api.html:tile=font_manager でフォントの一覧を確認できる。

import matplotlib.font_manager as fm
for path in fm.findSystemFonts():
    fp = fm.FontProperties(fname=path)
    print(fp.get_name())

フォント名を設定する。

fontfamily または fontname で使用するフォントを設定できる。

# フォント名一覧を取得する。
import matplotlib.font_manager as fm
fontnames = [fm.FontProperties(fname=path).get_name()
         for path in fm.findSystemFonts()]

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

for i, name in enumerate(fontnames):
    x, y = 0.1, 0.2 + i * 0.15
    text = "fontfamily='{}'".format(name)
    ax.text(x, y, text, fontname=name, fontsize=16)

plt.show()


フォントサイズを設定する。

fontsize でフォントサイズを指定できる。

  • int: フォントサイズを pt で指定する。
  • str: でフォントのフォントサイズからの相対的な大きさで指定する。
    • xx-small: default size * 1.2**-3 (=0.58)
    • x-small: default size * 1.2**-2 (=0.69)
    • small: default size * 1.2**-1 (=0.83)
    • medium: default size * 1.2**0 (=1.00)
    • large: default size * 1.2**1 (=1.20)
    • x-large: default size * 1.2**2 (=1.44)
    • xx-large: default size * 1.2**3 (=1.73)
fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['xx-small', 'x-small', 'small',
          'medium', 'large', 'x-large', 'xx-large']
for i, p in enumerate(params):
    x, y = 0.1, 0.1 + i * 0.15
    s = "fontsize='{}'".format(p)
    text = ax.text(x, y, s, fontsize=p)
    print('{:8}: {:.2f}pt'.format(p, text.get_size()))

plt.show()
xx-small: 5.79pt
x-small : 6.94pt
small   : 8.33pt
medium  : 10.00pt
large   : 12.00pt
x-large : 14.40pt
xx-large: 17.28pt


フォントスタイルを設定する。

fontstyle でフォントスタイル (通常、イタリック、斜体) を指定できる。
フォントが対応していれば指定が反映される。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['normal', 'italic', 'oblique']
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.15
    s = "fontstyle='{}'".format(p)
    ax.text(x, y, s, fontstyle=p, fontname='serif', fontsize=16)

plt.show()


フォントの太さを指定する。

fontweight でフォントの太さを設定できる。
フォントが対応していれば指定が反映される。

  • int: [0, 1000] の整数
  • str: 太さを表す文字列
fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman',
          'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black']
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.15
    s = "fontweight='{}'".format(p)
    ax.text(x, y, s, fontweight=p, fontname='serif', fontsize=16)

plt.show()


フォントを伸縮を設定する。

fontstretch でフォントの伸縮を設定できる。
フォントが対応していれば指定が反映される。

  • int: [0, 1000] の整数
  • str: 伸縮を表す文字列
fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed',
          'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded']
for i, p in enumerate(params):
    x, y = 0.1, 0.1 + i * 0.15
    s = "fontstretch='{}'".format(p)
    ax.text(x, y, s, fontstretch=p, fontname='serif', fontsize=16)

plt.show()


フォントをスモールキャップにするかどうかを設定する。

fontvariant でフォントをスモールキャップにするかどうかを設定できる。
フォントが対応していれば指定が反映される。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['normal', 'small-caps']
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.15
    s = "fontvariant='{}'".format(p)
    ax.text(x, y, s, fontvariant=p, fontname='serif', fontsize=16)

plt.show()


複数行の場合の行間を設定する。

linespacing でテキストが複数行の場合の行間を指定する。
単位はフォントサイズに対する割合。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = [1.5, 1.75, 2]
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.6
    s = "linespacing='{}'\naaa\nbbbbbb\nccccccccc".format(p)
    ax.text(x, y, s, linespacing=p, fontsize=16)

plt.show()


水平方向のアラインメントを設定する。

horizontalalignment または ha で位置 (x, y) に対する水平方向のテキストの配置方法を指定できる。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['left', 'right', 'center']
for i, p in enumerate(params):
    ax.axvline(x=0.1)
    x, y = 0.1, 0.2 + i * 0.2
    s = "horizontalalignment='{}'".format(p)
    ax.text(x, y, s, horizontalalignment=p, fontsize=16)


垂直方向のアラインメントを設定する。

verticalalignment または va で位置 (x, y) に対する垂直方向のテキストの配置方法を指定できる。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['center', 'top', 'bottom', 'baseline', 'center_baseline']
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.2
    ax.axhline(y=y)
    s = "verticalalignment='{}'".format(p)
    ax.text(x, y, s, verticalalignment=p, fontsize=16)


複数行の場合のアラインメントを設定する。

fig, ax = plt.subplots()
ax.invert_yaxis()
ax.set_axis_off()

params = ['left', 'right', 'center']
for i, p in enumerate(params):
    x, y = 0.1, 0.2 + i * 0.5
    s = "multialignment='{}'\naaa\nbbbbbb\nccccccccc".format(p)
    ax.text(x, y, s, multialignment=p, fontsize=16)

plt.show()


テキストの回転角度を設定する。

fig = plt.figure(figsize=(8, 5))

params = ['vertical', 'horizontal', 0, 90, 180, 270]
for i, p in enumerate(params):
    ax = fig.add_subplot(2, 3, i + 1)
    ax.set_axis_off()
    s = "rotation='{}'".format(p)
    ax.text(0.5, 0.5, s, rotation=p, fontsize=14, ha='center', va='center')

plt.show()


Tex を使う。

$$ で囲まれたテキストは Tex 記法としてレンダリングされる。
Tex はバックスラッシュから始まるコマンドが多いが、Pythonエスケープが必要な文字なので、r'テキスト' として raw 文字列を使うとよい。

fig, ax = plt.subplots()
ax.set_axis_off()
s = r'$\nabla^2 =\frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}$'
ax.text(0.5, 0.5, s, ha='center', fontsize=30)

plt.show()