散点图的R版本(matlab中)

4

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中再现的图形表示

"等价物"在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")

Not the nice graphical representation as in matlab


2
它缺少哪些参数?请[编辑]您的问题以添加更多细节。 - Андрей Беньковский
还要查看plot3D包和这个演示文稿 - Ben Bolker
仍然不清楚你缺少什么。这些图是从不同的默认角度和不同的颜色映射查看的,但除此之外...? - Ben Bolker
@BenBolker 我能做到的最好的是使用x轴和y轴之间90度的角度。我知道这些是相同的图形。我试图获得xy平面的“俯视图”。这将使查看聚类算法性能更容易。 - Ajmal
3个回答

4

简而言之,令我惊讶的是,你说的对,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() 绘制你的点。

## 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)

enter image description here

这不是您的图形,因为我认为您启用了等轴测。 要启用等轴测,请将视点移动到离对象很远的地方(即将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)

在这里输入图片描述

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

(这个上面的丑陋的z标签被忘记关闭了)。

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

enter image description here


谢谢!这是个好技巧。忽略掉 z 轴并使用 xy 坐标轴可以实现目标,但稍后我需要绘制所有维度并且 perps() 函数会派上用场。再次感谢您清晰的解释。 - Ajmal

2

只需稍微修改一行代码,您就可以画出喜欢的螺旋图:

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

enter image description here


1
如果您对交互性和反映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)
}

将会为您提供相当详细的三维散点图:

interactive


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接