作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在有点痛苦。
我正在寻找一种绘制成分数据的方法。( https://en.wikipedia.org/wiki/Compositional_data )。我有四个类别,因此数据必须可以用 3d 单纯形表示(因为一个类别总是 1 减去其他类别的总和)。
所以我必须绘制一个 四面体 (边将是我的四个类别)包含我的数据点。
我找到了这个 github https://gist.github.com/rmaia/5439815但使用pavo
package(tcs, vismodel...) 对我来说很模糊。
我还在组合包中发现了其他东西,带有函数 plot3D。但在这种情况下,RGL 设备是打开的(?!),我真的不需要旋转图,而只需要静态图,因为我想另存为图像并插入到我的论文中。
更新:数据看起来像这样。仅考虑暴力犯罪(总计)、强奸、谋杀、抢劫、agravated_assault 列
[ cities violent_crime murder rape rape(legally revised) robbery
1 Autauga 68 2 8 NA 6
2 Baldwin 98 0 4 NA 18
3 Barbour 17 2 2 NA 2
4 Bibb 4 0 1 NA 0
5 Blount 90 0 6 NA 1
6 Bullock 15 0 0 NA 3
7 Butler 44 1 7 NA 4
8 Calhoun 15 0 3 NA 1
9 Chambers 4 0 0 NA 2
10 Cherokee 49 2 8 NA 2
aggravated_assault
1 52
2 76
3 11
4 3
5 83
6 12
7 32
8 11
9 2
10 37
最佳答案
以下是使用 geometry
在没有专用软件包的情况下如何做到这一点的方法。和 plot3D
.使用您提供的数据:
# Load test data
df <- read.csv("test.csv")[, c("murder", "robbery", "rape", "aggravated_assault")]
# Convert absolute data to relative
df <- t(apply(df, 1, function(x) x / sum(x)))
# Compute tetrahedron coordinates according to https://mathoverflow.net/a/184585
simplex <- function(n) {
qr.Q(qr(matrix(1, nrow=n)) ,complete = TRUE)[,-1]
}
tetra <- simplex(4)
# Convert barycentric coordinates (4D) to cartesian coordinates (3D)
library(geometry)
df3D <- bary2cart(tetra, df)
# Plot data
library(plot3D)
scatter3D(df3D[,1], df3D[,2], df3D[,3],
xlim = range(tetra[,1]), ylim = range(tetra[,2]), zlim = range(tetra[,3]),
col = "blue", pch = 16, box = FALSE, theta = 120)
lines3D(tetra[c(1,2,3,4,1,3,1,2,4),1],
tetra[c(1,2,3,4,1,3,1,2,4),2],
tetra[c(1,2,3,4,1,3,1,2,4),3],
col = "grey", add = TRUE)
text3D(tetra[,1], tetra[,2], tetra[,3],
colnames(df), add = TRUE)
phi
调整方向和
theta
scatter3D
中的参数.
关于r - 用 R 中的数据点绘制四面体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42467254/
我想绘制 3-simplex,它包含 3D 中的一些随机点。例如: pts <- rnorm(30) pts <- matrix(pts, ncol = 3) 有了这些点,我想计算刚好包含这些点的 3
我是一名优秀的程序员,十分优秀!