気ままに宙をみる

宇宙, 統計, 時々私事

matplotlibで領域の図示

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

matplotlibで領域に色を付けてみたのでメモ。
fill_between関数fill関数を使うと大体できます。

sin(x)とcos(x)の間の領域に色を付ける。

まずはsin(x)とcos(x)の間に色を付けてみます。
fill_betweenは3つの変数を取ります。
x: x軸の範囲指定
y1,y2: この2つの間を塗りつぶす

あとはオプションでfacecolorは色、alphaは透過度なんかを指定できます。

import numpy as np
import matplotlib.pyplot as plt
from math import *

x = np.arange(0,10,0.01)
y1 = np.sin(x)
y2 = np.cos(x)
plt.fill_between(x,y1,y2,facecolor='y',alpha=0.5)
plt.show()

f:id:cranethree:20150725200210p:plain

条件を指定して図示

図示の条件がついた場合は少し面倒になります。
1条件の場合(y1>y2)などでいい場合はオプションwhere=y1>y2で追加すればいいですが、2条件(y1>y2 かつ xの範囲指定)になるとwhereでは書けません。
下のコードではグラフを書く部分と色を塗る部分を完全に分けています。

import numpy as np
import matplotlib.pyplot as plt
from math import *

x = np.arange(0,10,0.01)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,color="k")
plt.plot(x,y2,color="k")

x1 = np.arange(0,5,0.01)
z1 = np.sin(x1)
z2 = np.cos(x1)
plt.fill_between(x1,z1,z2,where=z1>z2,facecolor='y',alpha=0.5)
plt.show()

f:id:cranethree:20150725202209p:plain

さらに複雑な場合

3つ以上の関数で領域に色を塗る場合にはminimum関数やmaximum関数を使います。(minimum,maximumの使用は(from pylab import *)が必要です。
\[y > 5x,\ \ y < x,\ \ y < -x^2 + 5\]
この条件を満たす領域に色を塗ってみます。

import numpy as np
import matplotlib.pyplot as plt
from math import *
from pylab import *

x1 = np.arange(0, 2, 0.001)
y2 = - x1 ** 2 + 5
y3 = x1
y4 = 5 * x1
y5 = minimum(y2,y4)
plt.fill_between(x1,y3,y5,where=y5>y3,facecolor='y',alpha=0.5)

plt.plot(x1,y2,color="k")
plt.plot(x1,y3,color="k")
plt.plot(x1,y4,color="k")
plt.show()

ちょっとごちゃごちゃしてますがこんな感じでしょうか。
f:id:cranethree:20150725204457p:plain

おまけ

座標が分かっていてその内部を塗りつぶす場合はfill関数が楽です。長方形を図示したいような場合はこっちがいいです。
例(1,0),(2,0.3),(2,1),(1.4,0.7),(1,1)の内部の塗りつぶし。

import matplotlib.pyplot as plt
testx = [1,2,2,1.4,1]
testy = [0,0.3,1,0.7,1]
plt.fill(testx,testy,color="y",alpha=0.5)
plt.show()

f:id:cranethree:20150725204213p:plain