【问题标题】:Combining multiple ggplot geoms in a for-loop在 for 循环中组合多个 ggplot 几何图形
【发布时间】:2020-04-27 11:04:36
【问题描述】:

我有一个来自调查的定量数据集。我想为我拥有的值(最小 lb、最大 ub 和模式 ml)绘制拟合三角分布。请注意,我正在使用 rtriang() 因为我的数据不包含可以拟合密度函数的分位数。至少这是我的理解。

这段代码返回了很多单独的图表。我想将每个i(或受访者)的geom_density 对象显示到一个图表中。我将如何实现这一目标?

scenarios <- c("s1", "s2")
questions <- c("q1", "q2")
respondents <- c("1","2","3")

data_long <- data.frame(id=c("1","2","3", "1","2","3", "1","2","3",
                               "1","2","3", "1","2","3", "1","2","3",
                               "1","2","3", "1","2","3", "1","2","3",
                               "1","2","3", "1","2","3", "1","2","3"),
                         variable=c("s1_q1_ml", "s1_q1_ml", "s1_q1_ml",
                                      "s1_q1_lb", "s1_q1_lb", "s1_q1_lb",
                                      "s1_q1_ub", "s1_q1_ub", "s1_q1_ub",
                                      "s1_q2_ml", "s1_q2_ml", "s1_q2_ml",
                                      "s1_q2_lb", "s1_q2_lb", "s1_q2_lb",
                                      "s1_q2_ub", "s1_q2_ub", "s1_q2_ub",
                                      "s2_q1_ml", "s2_q1_ml", "s2_q1_ml",
                                      "s2_q1_lb", "s2_q1_lb", "s2_q1_lb",
                                      "s2_q1_ub", "s2_q1_ub", "s2_q1_ub",
                                      "s2_q2_ml", "s2_q2_ml", "s2_q1_ml",
                                      "s2_q2_lb", "s2_q2_lb", "s2_q1_lb",
                                      "s2_q2_ub", "s2_q2_ub", "s2_q1_ub"),
                         value=c(70, 70, 70, 60, 60, 60, 80, 80, 80,
                                   70, 70, 70, 60, 60, 60, 80, 80, 80,
                                   70, 70, 70, 60, 60, 60, 80, 80, 80,
                                   70, 70, 70, 60, 60, 60, 80, 80, 80))

data_long <- setDT(data_long)

for (i in respondents) {
  for (j in scenarios) {
    for (k in questions) {
      t <- rtriang(n =100000, min=as.numeric(data_long[id==i & variable == paste(j, k, "lb", sep = "_")]$value), 
                   mode=as.numeric(data_long[id==i & variable == paste(j,k, "ml", sep = "_")]$value),
                   max=as.numeric(data_long[id==i & variable == paste(j,k, "ub", sep = "_")]$value))

      # Displaying the samples in a density plot
      plot <- ggplot() + geom_density(aes(t)) + xlim(0,100) + xlab("Probability in %")
      ggsave(plot,filename=paste(i,j,k,".png",sep="_"))
    }
  }
}

【问题讨论】:

    标签: r for-loop ggplot2


    【解决方案1】:

    我不确定我是否完全理解。你在找这个吗?

    library(tidyverse)
    library(mc2d)
    
    temp <- data_long %>%
              separate(variable, c("scenarios", "questions", "temp"),sep = "_") %>%
              group_split(id) %>%
              map(~{
                  temp <- rtriang(
                            n =100000, 
                            min = .x %>% filter(temp == 'lb') %>% pull(value),
                            mode = .x %>% filter(temp == 'ml') %>% pull(value),
                            max = .x %>% filter(temp == 'ub') %>% pull(value))
                   ggplot(temp) + geom_density(aes(temp)) + 
                       xlim(0,100) + xlab("Probability in %")
                   })
    

    @Tjebo 建议的另一种方法

    temp <- data_long %>%
             separate(variable, c("scenarios", "questions", "temp"),sep = "_") %>%
             group_split(id) %>%
             map_df(~{
              data.frame(x = rtriang(n =100000, 
                         min = .x %>% filter(temp == 'lb') %>% pull(value),
                         mode = .x %>% filter(temp == 'ml') %>% pull(value),
                         max = .x %>% filter(temp == 'ub') %>% pull(value)))
                   }, .id = "id")
    
    
    ggplot(temp) + geom_density(aes(x, color = id)) + 
          xlim(0,100) + xlab("Probability in %")
    

    【讨论】:

    • 很好地使用地图等。我认为,OP 希望使用一些美学分组或刻面。
    • 我实际上在考虑facets(因为temp == 'lb'temp == 'ml' 等)`,但无法真正让它与temp 一起使用,从rtriang 生成。跨度>
    • 也许只是将 rtriang 结果存储为数据框,从 map 中绑定列表结果,并将 id 用作美学(例如temp &lt;- bind_rows(temp, .id = 'id') ; ggplot(temp) + geom_density(aes(temp, color = id))
    猜你喜欢
    • 2020-01-24
    • 2022-10-04
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多