代码之家  ›  专栏  ›  技术社区  ›  89_Simple

使用ggplot和facet_wrap绘制多个绘图

  •  -1
  • 89_Simple  · 技术社区  · 6 年前

    样本数据

    set.seed(123)
    df <- data.frame(loc.id = rep(c(1:3), each = 4*10), 
                            year = rep(rep(c(1980:1983), each = 10), times = 3),
                            day = rep(1:10, times = 3*4),
                            x = sample(123:200, 4*3*10, replace = T),
                            start = 123,
                            end = 200)
    

    我想保存每个 loc.id 多年来在一页纸上使用 facet_wrap 每一个 Lo.Id 以PDF格式在单独的页面中显示。跟随 循环执行以下操作:

    loc.vec <- 1:3
    
    pdf("my.pdf")
    
    for(l in  seq_along(loc.vec)){
    
      loc.id <- loc.vec[l]
      df.sub <- df[df$loc.id == loc.id,]
    
      pp <- ggplot(df.sub,aes(x = day, y = x)) + geom_line() +
              facet_wrap(~year) + 
              geom_vline(aes(xintercept = df.sub$start)) + 
              geom_vline(aes(xintercept = df.sub$end))
      print(pp)
    }
    dev.off()
    

    没有循环我能实现吗?

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   bVa    6 年前

    下面是一个使用 purrr :

    library(tidyverse)
    
    f_plot <- function(id) {
      df %>%
        filter(loc.id == id) %>%
        ggplot(., aes(x = day, y = x)) + 
        geom_line() +
        facet_wrap(~year) + 
        geom_vline(aes(xintercept = start)) + 
        geom_vline(aes(xintercept = end))
    }
    
    pdf("my2.pdf")
    map(loc.vec, f_plot)
    dev.off()
    
        2
  •  1
  •   Parfait    6 年前

    考虑 by (作为面向对象的包装器 tapply )按 位置向量 通过绘图确定因子并运行子集:

    process_plots <- function(df.sub) {    
      ggplot(df.sub, aes(x = day, y = x)) + 
        geom_line() + facet_wrap(~year) + 
        geom_vline(aes(xintercept = df.sub$start)) + 
        geom_vline(aes(xintercept = df.sub$end))      
    }
    
    pdf("my.pdf")    
    by(df, df$loc.vec, process_plots)
    dev.off()