matlab中的函数scatter3的R中是否有等效函数? 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")
答案 0 :(得分:4)
tl;博士令我惊讶的是,你是对的scatterplot3d
确实没有这种灵活性(我会发誓这样做)。但是,一个非常轻微的黑客行为允许您使用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
和(可选)theta
和r
参数以设置查看参数。 (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)
答案 1 :(得分:2)
答案 2 :(得分:1)
如果您对Matlab中的交互性和镜像感兴趣,请查看通过scatter3d
包提供的car
函数。
通过帮助部分提供的代码:
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)
}
将为您提供精美的三维散点图: