2

我有一个数据框,每个三元组都有 3 个三元轴,如下面的玩具示例

library(ggtern)
library(compositions)

dummy <- data.frame(
  t1 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t2 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t3 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t4 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t5 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t6 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3))
)

我的目标是为每个三元组(t1、t2、t3 等)获取每 3 列(x、y、z)并使用库绘制它们ggtern::ggtern()

首先我创建这个正则表达式向量:

regex <- paste0('^t', 1:6)

然后循环它并将其结合起来grep以获取每组 3 列,然后以某种方式绘制它们。

所以在循环的第一次迭代中,我们 grep t1

grep(regex[1], names(dummy), value = TRUE)

这是一个三元组的绘图函数的样子:

ggtern(
  data = dummy, mapping = aes(
  x = dummy[[1]],
  y = dummy[[2]],
  z = dummy[[3]]
  
)) + ggtern_custom() +
  Tlab(names(dummy[1])) +
  Llab(names(dummy[2])) +
  Rlab(names(dummy[3]))

不要担心ggtern_custom()这是一个帮助函数,可以使情节看起来更好。

最终目标是绘制所有 6 个而不只是 1 并将它们排列在一起(不是手动,而是使用函数/循环)

你能帮我完成这个想法吗?还有其他方法吗?我更喜欢基本的 R 解决方案。

4

1 回答 1

1

那这个呢:

library(ggtern)
library(compositions)
library(tidyr)
library(dplyr)

dummy <- data.frame(
  t1 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t2 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t3 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t4 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t5 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3)),
  t6 = rDirichlet.acomp(100, alpha = c(x=15,y=7,z=3))
)

dummy_long <- dummy %>% pivot_longer(everything(), names_pattern="(t\\d).([x-z])", 
                       names_to = c("var", ".value"))

ggtern(dummy_long, aes(x=x, y=y, z=z)) + 
  geom_point() + 
  facet_wrap(~var)

reprex 包于 2022-02-17 创建(v2.0.1)

于 2022-02-17T23:34:34.307 回答