R 滑らかな等高線 - eiichiromomma/CVMLAB GitHub Wiki
R) 滑らかな等高線
(データ数が少なくcontourでは満足出来ない場合
標準的な処理例
サンプルデータ
0.140 0.059 -0.076 -0.141 -0.076 0.059 0.140
0.900 0.378 -0.491 -0.909 -0.491 0.378 0.900
0.833 0.350 -0.455 -0.841 -0.455 0.350 0.833
0.000 0.000 0.000 0.000 0.000 0.000 0.000
-0.833 -0.350 0.455 0.841 0.455 -0.350 -0.833
-0.900 -0.378 0.491 0.909 0.491 -0.378 -0.900
-0.140 -0.059 0.076 0.141 0.076 -0.059 -0.140
Rcmdrとかでdstとしてインポート。
imageの出力
contourの出力
無理矢理補間する例
あくまでも補間なので過信しないこと
必要なpackage
- akima
imageでの補間
akimaのinterpを使う。
library(akima)
xl<-dim(dst)[2]
yl<-dim(dst)[1]
x<-rep(1:xl,yl)
y<-rep(1,xl)
for (i in c(2:yl)){
y<-rbind(y,rep(i,xl))
}
y<-as.vector(t(y))
idst<-interp(x,y,as.vector(as.matrix(t(dst))),xo=seq(1,xl,length=xl*10),yo=seq(1,yl,length=yl*10))
image(idst)
等高線
contourLinesを使って点を取得し、xsplineを使う。 ベースとするデータは元データを使う。interpは線形補間なので滑らかな点にならない。
ctlevel<-seq(-0.8,0.8,0.4)
count<-1
for (Lev in ctlevel){
ll<-contourLines(1:xl, 1:yl, as.matrix(t(dst)), levels=Lev)
for (i in 1:length(ll)){
points(ll[i](/eiichiromomma/CVMLAB/wiki/i)$x,ll[i](/eiichiromomma/CVMLAB/wiki/i)$y,col=count,pch=count)
ld<-xspline(ll[i](/eiichiromomma/CVMLAB/wiki/i)$x,ll[i](/eiichiromomma/CVMLAB/wiki/i)$y,1,draw=FALSE)
lines(ld, lty=count, lwd=count, col=count)
}
count<- count+1
}