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

/images/fig200429intersection.png

Hugo で構築されています。
テーマ StackJimmy によって設計されています。