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
    }