【问题标题】:R ggplot2 for loop plots same dataR ggplot2 for loop 绘制相同的数据
【发布时间】:2017-09-05 14:57:55
【问题描述】:

我已经组合了一个简单的 for 循环来生成一系列图,然后使用 grid.arrange 来绘制它们。我有两个问题:

  1. 图表的轴正确地更改为列名,但在每个图表上绘制相同数据。设置断点并逐步执行代码后,它似乎正在正确递增,所以我不确定为什么。

  2. 我已将情节美学设置为按年分组,但这会产生出现在图例中的中间 0.5 年。我以前没有遇到过这种情况。

应该都可以使用mtcars 重现。

library(ggplot2)
library(gridExtra)

result <- mtcars

for(i in 1:2) {
  nam <- paste("p", i, sep = "")
  assign(
    nam, ggplot(result, aes(x = disp, y = results[i+4], group = gear, color = gear)) +
      geom_line() +
      geom_point() +
      scale_colour_distiller(palette = "Dark2", direction = -1, guide = "legend") +
      scale_y_continuous(name = colnames(results[i+4])) +
      scale_x_continuous(name = "x")
  )
}


plist <- mget(paste0("p", 1:2))
do.call(grid.arrange, plist)

【问题讨论】:

  • 我不确定您要达到什么目的,但您检查过facet_wrap() 吗?如果数据来自同一个数据集,它可能就是您所需要的。

标签: r loops for-loop ggplot2


【解决方案1】:

我认为尝试通过 aes 映射中的编号访问列会使 ggplot 感到困惑。这有效:

for(i in 1:2) {
  nam <- paste("p", i, sep = "")
  assign(
    nam, ggplot(result,aes_string(x="disp",y=colnames(result)[i+4], group="gear", color="gear")) +
      geom_line() +
      geom_point() +
      scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
      scale_y_continuous(name=colnames(result[i+4])) +
      scale_x_continuous(name="x")
  )
}

不过,我建议对名称进行迭代;这使代码更清晰。这是一个执行此操作并跳过环境绕行的版本:

plots <- lapply(c("drat", "wt"), function(column) {
  ggplot(result,aes_string(x="disp",y=column, group="gear", color="gear")) +
    geom_line() + geom_point() +
    scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
    scale_y_continuous(name=column) +
    scale_x_continuous(name="x")}) %>% 
  do.call(grid.arrange, .)
do.call(grid.arrange, plots)

【讨论】:

    【解决方案2】:

    您的使用结果和结果。你应该使用 aes_string 然后按字符串名称引用变量:

    您还应该避免做大量的任务。把它全部放到一个list()中

    library(ggplot2)
    library(gridExtra)
    
    result<-mtcars
    
    for(i in 1:2) {
        nam <- paste("p", i, sep = "")
        assign(
            nam, ggplot(result,aes_string(x="disp",y=names(result)[i+4], group="gear", color="gear")) +
                geom_line() +
                geom_point() +
                scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
                scale_y_continuous(name=colnames(result[i+4])) +
                scale_x_continuous(name="x")
        )
    }
    
    
    plist <- mget(paste0("p", 1:2))
    do.call(grid.arrange, plist)
    

    【讨论】:

      【解决方案3】:

      问题是绘图是在 for 循环中生成的,但在 do.call 中进行了评估。由于 i 在 for 循环中已更改,因此两者都使用 i = 2 进行评估。您可以通过以下方式确认:

      i <- 3
      do.call(grid.arrange, plist)
      

      对您的代码稍作调整即可解决问题:

      for(i in 1:2) {
        nam <- paste("p", i, sep = "")
        coln <- colnames(result[i+4])
        assign(
          nam, ggplot(result,aes_(x=~disp,y=as.name(coln), group=~gear, color=~gear)) +
            geom_line() +
            geom_point() +
            scale_colour_distiller(palette = "Dark2", direction=-1, guide="legend") +
            scale_y_continuous(name=coln) +
            scale_x_continuous(name="x")
        )
      }
      
      
      plist <- mget(paste0("p", 1:2))
      do.call(grid.arrange, plist)
      

      【讨论】:

      • 感谢您解释为什么它不起作用 - 这完全符合我的预期(但不明白!)
      • P.S.知道为什么这些类在数据中没有添加 0.5 个分区吗??
      • 是的,gear 列是数字,被视为连续的。您可以使用breaks 参数指定要使用的值。使用uniquegear 的每个值设置不同的颜色。在这种情况下,将对应的行替换为scale_colour_distiller(breaks = unique(result$gear), palette = "Dark2", direction=-1, guide="legend") +
      【解决方案4】:

      你应该充分利用ggplot::facet_wrap

      这意味着将您的数据整理到一个可以被 ggplot 解释的数据框

      数据

      temp <- mtcars
      

      整理数据

      library(purrr)
      library(dplyr)
      Names <- map_chr(1:2, ~names(temp)[.x+4])
      # "drat" "wt"
      
      data <- map_df(1:2, ~temp[,c("cyl", names(temp)[.x+4])] %>% setNames(c("cyl", "value")), .id="iteration") %>%
                mutate(iteration = Names[as.numeric(iteration)])
      

      使用 facet_wrap 绘图

      ggplot(data=data, aes(x=cyl, y=value, label=iteration)) +
        geom_line() +
        geom_point() +
        facet_wrap(~iteration)
      

      【讨论】:

        猜你喜欢
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多