#目的
- 回帰分析で求めた直線や曲線からの距離に応じて、
プロットする点の色、濃さを変える。 - 距離の分布を他の図でも可視化する。
#コード
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set() #図がきれいに描画出来るおまじないらしい、私はいつも使っている
amp = 100 #振幅
frequency = 0.02 #周波数
offset = 1000 #オフセット
t = np.linspace(0,100,1000)
y_ = amp*np.sin(2*np.pi*frequency*t)+offset #理論値=回帰曲線sin
y = np.random.poisson(y_) #観測値=誤差付きsin
###メイン###
dis = abs( y_ - y )/ y_.max() #理論値と観測値の差を0.0~1.0の値にスケーリング
color_list=[ [1-9*i,0,i*9,i*5] for i in dis ] #RGBの値で色を指定
f = plt.figure(figsize = (12,6))
f.add_subplot(121)
plt.scatter(t,y_)
plt.xlabel('t')
plt.ylabel('y')
f.add_subplot(122)
plt.scatter(t,y,color = color_list)
plt.xlabel('t')
plt.ylabel('y')
#解説
まず、データについてだが、各時刻のsin波の値をnp.random.poisson(y_)
に代入するこで、
y は誤差が平均 **y_**のpoisson分布に従うsin波になっている。であるから、大きな値では誤差が大きくなり、小さな値では誤差が小さい。
今回のメインのグラデーションは、見ての通りfor文を用いてカラーを指定している。matplotlibでは、色の指定を[R,G,B,濃さ]=[r,g,b,c]で指定することが出来る。ただし、r,g,b,cは0.0~1.0の値を取る。
この仕組みを利用して、近距離では色が薄く、遠距離では濃くなるように四則演算をした。
今回の例では、近距離では薄い赤、遠距離では濃い青、になっている。
#注意点
- RGB値は0.0~1.0でなければならないので、係数でこの範囲に調整をしなければならないこと。
- 回帰曲線(回帰直線)付近は、当然、点が多いので、相当薄くしないと、点が重なり、密度が高いのか距離が近いのか区別できない。
#応用
今回の色指定は、回帰曲線からの距離を他の図でも可視化できる。
先程のコードを少し変更し、時間が進むにつれ誤差が大きくなる場合を考える。(コードは後述)
横軸 t ,縦軸 y 、横軸 y_ ,縦軸 y の図を考えると、
左図より、一目で距離(誤差)の増加が確認できる。右図からは、yとy_の距離はy_との相関があることが分かる。
このように、プロットする軸を変えることでデータへの理解をさらに深めることが期待できる。
観測値yを決めるパラメータが多くなれば、もっと様々な見方を楽しめる。
##改変コード
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
amp=100 #振幅
frequency=0.02 #周波数
offset=1000 #バイアス
t=np.linspace(0,100,1000)
y_=amp*np.sin(2*np.pi*frequency*t)+offset
y=np.random.poisson(y_+2.6*t) ###変更行###
dis=abs(y_-y)/y_.max()
color_list=[[1-3*i,0,3*i,i] for i in dis] ###変更行###
f=plt.figure(figsize=(12,6))
f.add_subplot(121)
plt.scatter(t,y,color=color_list)
plt.xlabel('t')
plt.ylabel('y')
f.add_subplot(122)
plt.scatter(y_,y,color=color_list)
plt.xlabel('y_')
plt.ylabel('y')