Построение нескольких графиков с использованием ggplot и facet_wrap - PullRequest
0 голосов
/ 31 мая 2018

Пример данных

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 и каждый loc.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 ]

0 голосов
/ 31 мая 2018

Рассмотрим by (являющийся объектно-ориентированной оболочкой для tapply), чтобы разделить фрейм данных с помощью фактора loc.vec и запустить подмножества на графике:

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()
0 голосов
/ 31 мая 2018

Вот решение, использующее 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...