Matplotlibで交点にラベルを表示する
やりたいこと
Pythonで図を書くためには、Matplotlibを使う。
講義で使用するための説明図を書くときには、線だけではなくて、交点にラベルをつけたい。
「二つの線の交点のうち、点Aは低い方で、点Bは高い方です。点Aより左側では利潤がマイナスで右側ではプラスです。ただ、Bを越えると再びマイナスになりますね。・・・」
といった感じで説明がしたい。
ストレートな方法は、手動で交点の座標を求めて、直接キャンバスに描画していく方法だ。 でも、それはめんどうだ。 僕がやりたい説明では、実は交点の座標はどうでもよくて、線が交わる場所に名前がついていればよい。
方法
そこで、こんな感じで考えた。
y1とy2の上下関係が変わったら、その点が交点だと考えることにする。 精度はもっとあげられるが、今回のばあいはこれで十分のようだ。
交点が近いと文字がかぶってしまうので、yoffsetを使って、偶数番目のラベルは交点の下に書くようにした。
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('Agg')
x = np.linspace(0,12,120)
y1 = [1]*120
y2 = x*(x-2)*(x-10)
l='abcdefgh'
k=0
flg = False
myfig = plt.figure()
ax1 = myfig.add_subplot(111)
ax1.plot(x,y1,'blue')
ax1.plot(x,y2,'green')
for i,xi in enumerate(x):
if ((y1[i] == y2[i]) or (flg != (y1[i] > y2[i]))):
yoffset = 10 if k % 2 else -10
ax1.text(xi, y1[i]+yoffset, '{l}'.format(l=l[k], fontsize=10)
flg = not flg
k += 1
ax1.legend(frameon=False, fontsize=10, numpoints=1, loc='lower left')
myfig.savefig('images/fig200429intersection.png')