添加点和彩色表面到locfit透视图

时间:2015-07-13 03:20:22

标签: r plot 3d transformation perspective

我有一个trans3d模型的透视图,我希望添加两个东西

  1. 预测变量作为3D空间中的点
  2. 根据Z轴值
  3. 为表面着色

    首先,我尝试使用library(locfit) X <- as.matrix(loc1[,1:2]) Y <- as.matrix(loc1[,3]) zz <- locfit(Y~X,kern="bisq") pmat <- plot(zz,type="persp",zlab="Amount",xlab="",ylab="",main="Plains", phi = 30, theta = 30, ticktype="detailed") x1 <- as.vector(X[,1]) x2 <- as.vector(X[,2]) Y <- as.vector(Y) points(trans3d(x1,x2,Y,pmat)) 功能。但即使我的变量采用矢量格式,我也会收到以下错误:

      

    cbind(x,y,z,1)中的错误%*%pmat:需要数字/复杂矩阵/矢量参数

    以下是我的代码片段

    function foo() {
      var a = 2;
    
      function bar() {
        console.log( a );
      }
      return bar;
    }
    
    function test() {
      var bz = foo();
      bz();
    }
    
    // prints 2. Here function bar referred by var bz is outside 
    // its lexical scope but it can still access it
    test(); 
    

    我的&#34; loc1&#34;数据可在此处找到 - https://www.dropbox.com/s/0kdpd5hxsywnvu2/loc1_amountfreq.txt?dl=0

1 个答案:

答案 0 :(得分:1)

TL,DR:不是真的在plot.locfit,但你可以重建它。

我不认为plot.locfit对此类定制有很好的支持。假设get.data=T调用中plot将绘制原始数据点(第1点),它似乎确实如此,除了 type="persp"。那里没有运气。或者,您可以points(trans3d(...))完成,除非您需要persp返回的透视矩阵,plot.locfit.3d不会返回它。再说一遍,没有运气。

对于着色,通常使用色标(http://r.789695.n4.nabble.com/colour-by-z-value-persp-in-raster-package-td4428254.html)并为每个z面分配与其相关的颜色。但是,您需要表面的z值(而不是原始数据的z值),plot.locfit似乎也不会返回此值。

所以要做你想做的事,你基本上就是在自己重新编码plot.locfit(不是很难,虽然只是狡猾)。

您可以将其放入一个函数中,以便重用它。 我们:

  1. 制作x-y点的均匀网格
  2. 计算每个点的拟合值
  3. 使用这些来绘制表面(使用色标),保存透视矩阵以便我们
  4. 绘制原始数据
  5. 这样:

    # make a grid of x and y coords, calculate the fit at those points
    n.x <- 20 # number of x points in the x-y grid
    n.y <- 30 # number of y points in the x-y grid
    zz <- locfit(Total ~ Mex_Freq + Cal_Freq, data=loc1, kern="bisq")
    xs <- with(loc1, seq(min(Mex_Freq), max(Mex_Freq), length.out=20))
    ys <- with(loc1, seq(min(Cal_Freq), max(Cal_Freq), length.out=30))
    xys <- expand.grid(Mex_Freq=xs, Cal_Freq=ys)
    zs <- matrix(predict(zz, xys), nrow=length(xs))
    
    # generate a colour scale
    n.cols <- 100 # number of colours
    palette <- colorRampPalette(c('blue', 'green'))(n.cols) # from blue to green
    # palette <- colorRampPalette(c(rgb(0,0,1,.8), rgb(0,1,0,.8)), alpha=T)(n.cols) # if you want transparency for example
    # work out which colour each z-value should be in by splitting it
    #  up into n.cols bins
    facetcol <- cut(zs, n.cols)
    
    # draw surface, with colours (col=...)
    pmat <- persp(x=xs, y=ys, zs, theta=30, phi=30, ticktype='detailed', main="plains", xlab="", ylab="", zlab="Amount", col=palette[facetcol])
    
    # draw your original data
    with(loc1, points(trans3d(Mex_Freq,Cal_Freq,Total,pmat), pch=20))
    

    注意 - 看起来不太漂亮!可能想要调整说你的颜色比例颜色,或者facet的透明度等。Re:添加图例,有一些other questions处理它。

    enter image description here

    (PS:耻辱ggplot不做3D散点图。)