在R中绘制带有数据点的四面体。

5

目前我有点疼痛。

我正在寻找一种绘制组成数据的方法。(https://en.wikipedia.org/wiki/Compositional_data)。我有四个类别,所以数据必须能够在三维单纯形中表示(因为一个类别总是其他类别之和的1减去)。

因此,我必须绘制一个四面体(边缘将是我的四个类别),其中包含我的数据点。

我发现了这个github https://gist.github.com/rmaia/5439815,但是对于pavo包(tcs,vismodel...)的使用对我来说相当晦涩。

我还在composition包中找到了其他内容,具有plot3D函数。但是在这种情况下会打开RGL设备(?!),而我不需要旋转图,只需要静态图,因为我想将其保存为图像并插入我的论文中。

更新:数据如下所示。仅考虑violent_crime(总数),rape,murder,robbery,aggravated_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

更新:我的最终图使用composition包制作。

enter image description here


有趣的问题。您能否分享您的数据和尝试过的代码的至少一部分? - David C.
2
最后,我终于使用compositions包成功地进行了一个表示,并通过截图进行保存。代码: library(compositions)punti <- as.data.frame(na.omit(crime_county[,c(5,6,8,9)])) plot3D.acomp(acomp(punti), 1:4, col = "green", size = 4, vlabs.col = "black", scale = T) - Marco Fumagalli
1个回答

1

以下是如何使用geometryplot3D来完成此操作的,无需专用软件包。 使用您提供的数据:

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

enter image description here

你可以通过在scatter3D中使用phitheta参数来调整方向。

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