r - 如何旋转 3D 散点图
问题描述
下面是使用 scatterplot3d() 函数运行高度、体重和体积的 3D 散点图的代码,其中点是 1-6 之间的类值。角度目前为 45 度,我知道我可以通过改变角度来倾斜绘图。我使用什么代码将绘图向左或向右旋转,以便提供绘图的多个视图?
df
# Class height weight volume
# 1 4 0.83 0.85 0.83
# 2 2 0.75 0.80 0.76
# 3 3 0.75 0.80 0.84
# 4 5 0.52 0.59 1
# 5 6 0.52 0.59 0.99
color <- c(rgb(0.68, 0.93, 0.96), rgb(0, 0.74, 0.92), rgb(0.68, 0.86, 0.49), rgb(1, 0.8, 0.3),
rgb(1, 0, 0))
scatterplot3d(x=c(0.0, 0.5, 0.5, 0, 0), y=c(0, 0, 0.5, 0.5, 0), z=c(0, 0, 0, 0, 0), box=T, type='l',
color='grey', grid=F, lwd=2, xlab='height', ylab='', zlab='volume', xlim=c(0, 1), ylim=c(0, 1),
zlim=c(0,1), angle=45)
text(7, 0, 'weight', srt=45)
par(new=T)
scatterplot3d(x=c(0.0, 0.5, 0.5, 0.0, 0.0), y=c(0.5, 0.5, 1, 1, 0.5), z=rep(0,5), box=F, type='l',
color='grey', grid=F, lwd=2,xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0,1),
axis=F, angle=45)
par(new=T)
scatterplot3d(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.0, 0.0, 0.5, 0.5, 0.0), z=rep(0,5), box=F, type='l',
color='grey', grid=F, lwd=2,
xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0,1), axis=F, angle=45)
par(new=T)
scatterplot3d(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.5, 0.5, 1, 1, 0.5), z=rep(0,5), box=F, type='l',
color='grey', grid=F, lwd=2,
xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0,1), axis=F, angle=45)
par(new=T)
for (i in 6:2) {
scatterplot3d(height[Class==i], weight[Class==i], volume[Class==i], box=F, pch=c(2,1,0,1,20)[i-1],
color=color[i-1], grid=F,
xlab='', ylab='', zlab='', xlim=c(0, 1), ylim=c(0, 1), zlim=c(0, 1), axis=F, angle=45)
par(new=T)
}
legend(0.2, 4.7, legend=c(paste('Level', 2:6)), pch=c(2,1,0,1,19), col=color, title='Class',
cex=0.70)
解决方案
这是您的数据的两个视图。您应该始终使用dput()
将数据粘贴到问题中,以便我们可以轻松访问它:
dfa <- structure(list(Class = c(4L, 2L, 3L, 5L, 6L), height = c(0.83,
0.75, 0.75, 0.52, 0.52), weight = c(0.85, 0.8, 0.8, 0.59, 0.59),
volume = c(0.83, 0.76, 0.84, 1, 0.99)), class = "data.frame",
row.names = c("1", "2", "3", "4", "5"))
我们可以通过使用以下返回的函数来大大简化您的代码scatterplot3d
:
library(scatterplot3d)
color <- c(rgb(0.68, 0.93, 0.96), rgb(0, 0.74, 0.92), rgb(0.68, 0.86, 0.49),
rgb(1, 0.8, 0.3), rgb(1, 0, 0))
plt <- with(dfa, scatterplot3d(height, weight, volume, xlim=c(0, 1), ylim=c(0, 1),
zlim=c(0, 1), ylab="", color=color, pch=c(2, 1, 0, 1, 20), grid=FALSE,
scale.y=1, angle=45))
plt$points3d(x=c(0, 1), y=c(0.5, 0.5), z=c(0, 0), type="l", col="grey")
plt$points3d(x=c(0.5, 0.5), y=c(0, 1), z=c(0, 0), type="l", col="grey")
xy <- unlist(plt$xyz.convert(1.25, .5, 0))
text(xy[1], xy[2], "weight", srt=45, pos=2)
legend(0.2, 4.7, legend=c(paste('Level', 2:6)), pch=c(2,1,0,1,19), col=color,
title='Class', cex=0.70)
请注意,我们估计 y 轴标签的位置并使用函数将 3d 坐标转换为 2d 以进行绘图。现在我们将进行 135 度旋转:
plt <- with(dfa, scatterplot3d(height, weight, volume, xlim=c(0, 1), ylim=c(0, 1),
zlim=c(0, 1), ylab="", color=color, pch=c(2, 1, 0, 1, 20), grid=FALSE,
scale.y=.75, angle=135))
plt$points3d(x=c(0, 1), y=c(0.5, 0.5), z=c(0, 0), type="l", col="grey")
plt$points3d(x=c(0.5, 0.5), y=c(0, 1), z=c(0, 0), type="l", col="grey")
xy <- unlist(plt$xyz.convert(-0.2, .5, 0))
text(xy[1], xy[2], "weight", srt=-45, pos=4)
legend(0.2, 4.7, legend=c(paste('Level', 2:6)), pch=c(2,1,0,1,19), col=color,
title='Class', cex=0.70)
推荐阅读
- c# - 如何在 DataGridView (C#) 中配置数据
- spring - 在 Kafka Streams 中创建全局状态存储(春季)
- xcode - 如何在我的项目中使用静态库的协议?
- vue.js - __webpack_public_path__ 在 vuejs
- python - 如何从 zip 中提取 csv 文件并在 python 中将其保存到磁盘?
- json - JsonMappingException:不是地图,不是数组或不是枚举
- excel - 从启用宏的工作簿复制数据
- github - Hygieia Github Collector 没有获取旧的提交
- here-api - HERE 地图显示和地点 API 之间的结果不一致
- c# - 如何在 IIS windows 身份验证 C# 上添加提供程序