交点を自動で計算し、記号をつける
だいたい、経済学で必要な曲線は自由に書けるようになってきた。 あとは位相なんかで使う陰関数だけど、僕は使うことない。必要な方はこちらあたりを参照して、countourというコマンドの使いかたを覚えればよい。
さて、次は交点に記号をつける。
交点に記号がついていると、
「二つの線の交点のうち、点Aは低い方で、点Bは高い方です。点Aより左側では利潤がマイナスで右側ではプラスです。ただ、Bを越えると再びマイナスになりますね。・・・」
といった感じで説明ができて、とても分かりやすい。
交点に記号がついていないと、
「この線とこの線の交じわる点、ここ、が均衡になります。さらに無差別曲線と交じわる点は 二つあって、左側が。。。」
という感じで分からなくもないけど、だんだん混乱してきだします。講義なら、ポインタで指すこともできるけれど、文章での表現なら非常にまだるっこしい。
そんなわけで、きちんと記号をつけておくことにする。
図に記号を書くときの位置決めは、PowerPointなどを使って、手作業だと一発で決まる。 が、曲線をちょっと変更すると、すべてがずれてしまって、またやりなおしだ。
そこで、自動で記号の位置を計算して記入する。
自動での記号のつけかたは、以前やった方針でだいたい大丈夫だと思っていた。
y1とy2の上下関係が変わったら、その点が交点だと考えることにする。 (出所:「Matplotlibで交点にラベルを表示する - ときどきエコ」、https://blog.ecofirm.com/post/pythongraphintersections200429/ )
が、問題があった。 この方法では、上下関係が変わらなければ、交点と判定しない。 つまり、無差別曲線と予算線が接するばあいは、交点とみなしてくれない。
若干コードが複雑になるけれど、ここをちゃんとやっておけば、あとで楽になる。
方針
コードの後半は前回の「経済学のグラフを書く、その2:無差別曲線と予算線」と同じだ。 ただし、draw_intersection(ax, x1, y1, y2, figlabels)という行が増えている。 この行で交点の座標を記入する。 もちろん、この行だけでは座標の記入はできなくて、この行が呼びだすdraw_intersectionという関数が実際の処理を担当する。
交点かどうかの判定は、if_intersection(y1, y2, i)で行なう。
判定基準は次の3つだ。
- y座標が同じ
- y座標の上下が入れ変わる
- y座標が近づいていたが、また離れる。その一番近い距離が基準以下。
1と2は以前と同じだ。 今回追加したのは3の条件だ。 判定のために二つ前までのy座標を使う。
x=i点のy座標の差をdy[i]とするとき、2つ前dy[i-2]から1つ前dy[i-1]の差と1つ前dy[i-1]から現時点dy[i]の差の符号が逆転しているかどうかを判定する。
このとき、精度の関係で、dy[i]=0とはならないので、dy[i]が一定の基準以下であるばあいに、交点とする。 一定の基準というのは、だいたい試行錯誤して決めればいいけれど、0.001から0.0001ぐらいでよいと思う。 そもそも、x座標を0.01刻み以上ぐらいで作っている(useedによって異なる)ので、あまり小さくしても仕方がない。
交点がすごく多い図を書くケースが多ければ、figlabelsの文字を増やしておく。
<img src="" alt="" width="100%"/>
できた。
次は塗りつぶし
ここまでで、線で図を描き、必要な情報を記入できるようになった。
次は、複数の線で囲まれた領域などを塗りつぶせるようにする。