〰️

matplotlibで枠線を書く:点線の縁取り

2023/03/30に公開

はじめに

matplotlibで作成した線を枠線で縁取ったことはありますか?
線を縁取ることで、線がはっきりするので複数の線が乱立しているような図では役に立つかもしれません。

実線の縁取りは簡単なものの、点線の縁取りは専用の機能を使わないとできない上に日本語の参考記事がなかったので、今回作成しました。

結論

matplotlib.patheffectsで枠線の設定をしよう!!

import matplotlib.pyplot as plt
import matplotlib.patheffects as pe

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

lw = 5

line_style = dict(linestyle='--',linewidth=lw, color='r' , path_effects=[pe.Stroke(linewidth=lw+2, foreground='b'), pe.Normal()])
plt.plot(x, y, **line_style)

枠線の作り方

良くない例

真っ先に思いつくのは、太い線を最初に書き、その上から線を付け足す方法です。
この方法は以下のように書け、実線の場合にうまくいきます。

import matplotlib.pyplot as plt
import matplotlib.patheffects as pe

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

lw = 5

line_style = dict(linewidth=lw+2, color='b')
plt.plot(x, y, **line_style)

line_style = dict(linewidth=lw, color='r')
plt.plot(x, y, **line_style)

一方で点線の場合はうまくいきません。

import matplotlib.pyplot as plt
import matplotlib.patheffects as pe

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

lw = 5

line_style = dict(linestyle='--',linewidth=lw+2, color='b')
plt.plot(x, y, **line_style)

line_style = dict(linestyle='--',linewidth=lw, color='r')
plt.plot(x, y, **line_style)

良い例

上記の問題を解決するためにmatplotlib.patheffectsで枠線の設定をします。
実線でも点線でもどちらも対応していてプログラムの量も減るので推奨です。

import matplotlib.pyplot as plt
import matplotlib.patheffects as pe

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

lw = 5

line_style = dict(linestyle='--',linewidth=lw, color='r' , path_effects=[pe.Stroke(linewidth=lw+2, foreground='b'), pe.Normal()])
plt.plot(x, y, **line_style)

Discussion