Matplotlibで図形をclip(一部表示)

Matplotlibpython 的世界でよく使われるグラフ描画ソフトであるが、 グラフの一部表示(clip)で手こずったのでメモをしておく。

まず何か適当なグラフを描く。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import matplotlib.lines as mpllines
import matplotlib.patches as mplpatches

fig = plt.figure()
ax = fig.add_subplot(111)

r = mplpatches.Rectangle([3,3], 6, 2, fc='orange', ec='orange')
l = mpllines.Line2D([1,3,6,9], [4,8,2,5], c='lightgreen')

ax.add_line(l)
ax.add_patch(r)

ax.axis('tight')
ax.axis('equal')
plt.show()
適当なグラフ

緑色の折れ線グラフのうち、オレンジ色の長方形に重なる部分だけを表示しようというのが今回のお題。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt
import matplotlib.lines as mpllines
import matplotlib.patches as mplpatches

fig = plt.figure()
ax = fig.add_subplot(111)

r = mplpatches.Rectangle([3,3], 6, 2, fc='none', ec='orange')
l = mpllines.Line2D([1,3,6,9], [4,8,2,5], c='lightgreen')

ax.add_line(l)
ax.add_patch(r)

l.set_clip_path(r)

ax.axis('tight')
ax.axis('equal')
plt.show()

14行目で折れ線グラフ図形(l)に対してset_clip_pathを呼んでいてその引数に長方形(r)を渡している点に注意。 これで、l を r の形に clip せよということのようである。

8行目で fillcolor(fc)を’none’にしているので下の画像では長方形の枠だけが描かれているが、勿論 edgecolor(ec)も’none’にすれば長方形自体は表示されない。

11-12行目のadd_lineやadd_patchと、14行目のset_clip_pathの順序が重要である模様で、先にset_clip_pathしてからadd_hogeするとダメになる。

clipしたグラフ

2018/Jan/06頃書いた。