【问题标题】:R version of scatter3 (matlab)R版本的scatter3(matlab)
【发布时间】:2016-12-17 15:46:02
【问题描述】:

R中是否有matlab中函数scatter3的等效函数? scatterplot3d 缺少一些参数。

例子:(在matlab中)

    N = 2^11; 
    t = rand(1,N);
    t = sort(4*pi*sqrt(t))'; 
    z = 8*pi*rand(N,1); 
    x = (t+.1).*cos(t);
    y = (t+.1).*sin(t);

    cmap = jet(N);
    scatter3(x,y,z,20,cmap);

R 中的“等价物”并没有给出相同的表示形式:

    N = 2^11 
    t = runif(N)
    t = sort(4*pi*sqrt(t))
    z = 8*pi*runif(N) 
    x = (t+0.1)*cos(t)
    y = (t+0.1)*sin(t)

    library(gplots)
    cmap = rich.colors(N)

    library(scatterplot3d)
    par(mfrow = c(1,1))
    scatterplot3d(x,y,z, color = cmap, cex.symbols = 3, type = "b")

【问题讨论】:

  • 缺少哪些参数?请edit您的问题以添加更多详细信息。
  • 还可以查看plot3D 包和this presentation
  • 仍然不清楚您缺少什么。这些图是从不同的默认角度查看的,颜色图是不同的,但除此之外......?
  • @BenBolker 我能得到的最好结果是在 x 轴和 y 轴之间使用 90 度角。我知道这些是相同的图表。我试图获得 xy 平面的“顶部视图”。这将使查看聚类算法性能更容易。

标签: r matlab


【解决方案1】:

tl;dr 令我惊讶的是,scatterplot3d 确实没有这种灵活性(我发誓它有),这是对的。但是,一个非常轻微的 hack 可以让您使用 persp() 来执行此操作。

设置数据(感谢可重现的示例)。

N <- 2^11 
t <- runif(N)
t <- sort(4*pi*sqrt(t))
z <- 8*pi*runif(N) 
x <- (t+0.1)*cos(t)
y <- (t+0.1)*sin(t)

与您所拥有的颜色非常接近的颜色图:

cmap <- colorRampPalette(c("blue","cyan"))(N)

诀窍是设置一个具有正确尺寸的空persp(),设置phi 和(可选)thetar 参数来设置查看参数。 (phi=90 将查看 x-y 平面。)然后使用 trans3d()persp() 返回的变换矩阵来绘制您的点。

## empty plot
pp <- persp(range(x),range(y),matrix(c(min(z),max(z),0,0),2),
      col=NA,border=NA,phi=90,zlab="")
## plot:
points(trans3d(x,y,z,pp),col=cmap)

这看起来不像您的情节,因为(我认为)您启用了等距透视。要做到这一点,请将视点从对象移开很远(即,将r 设置为较大的值):

pp2 <- persp(range(x),range(y),matrix(c(min(z),max(z),0,0),2),
      col=NA,border=NA,phi=90,r=1000)
points(trans3d(x,y,z,pp2),col=cmap)

(忘了关掉这个丑陋的z标签)。

另一方面,如果您只想查看 x-y 平面中的点,为什么不直接使用普通的 plot() 并忽略 z 坐标???

plot(x,y,cex=5,col=cmap)

【讨论】:

  • 谢谢!这是一个巧妙的技巧。忽略 z 轴并使用 xy 绘图就可以了,但我需要稍后绘制所有维度,并且 perps() 函数会派上用场。再次感谢您的明确解释。
【解决方案2】:

只需稍微修改一行代码,您可能会喜欢绘制的螺旋:

scatterplot3d(x,z,y, color = cmap, cex.symbols = 1.2, pch=19, type = "b")

【讨论】:

    【解决方案3】:

    如果您对交互性和镜像 Matlab 中可用的内容感兴趣,请查看通过 car 包提供的 scatter3d 函数。

    帮助部分提供的代码:

    require(car)
    if(interactive() && require(rgl) && require(mgcv)){
        scatter3d(prestige ~ income + education, data=Duncan)
        Sys.sleep(5) # wait 5 seconds
        scatter3d(prestige ~ income + education | type, data=Duncan)
        Sys.sleep(5)
        scatter3d(prestige ~ income + education | type, surface=FALSE,
                  ellipsoid=TRUE, revolutions=3, data=Duncan)
        scatter3d(prestige ~ income + education, fit=c("linear", "additive"),
                  data=Prestige)
        Sys.sleep(5)
        scatter3d(prestige ~ income + education | type,
                  radius=(1 + women)^(1/3), data=Prestige)
    }
    

    会给你非常精细的 3d 散点图:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多