循环的R ggplot2绘制相同的数据

时间:2017-09-05 14:57:55

标签: r loops for-loop ggplot2

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

  1. 图表的轴正确更改为列名称,但相同的数据在每个图表上绘制。放入断点并逐步执行代码后,它似乎正在递增,因此我不确定原因。

  2. 我已经将情节美学设置为年度组,但是这会产生出现在传奇中的5年。这在我以前没发生过。

  3. 应该使用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)
    

4 个答案:

答案 0 :(得分:2)

我认为尝试通过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)

答案 1 :(得分:0)

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

你还应该避免做大量的作业。把它全部放入一个列表()

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)

答案 2 :(得分:0)

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

i

对代码进行小幅调整可以解决问题:

i = 2

答案 3 :(得分:0)

您应该充分利用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)