Plusieurs graphiques sur plusieurs pages en utilisant ggplot

je fais une analyse exploratoire de mes données et j'ai besoin de tracer des graphiques multiples en utilisant ggplot. La quantité de graphiques est vraiment énorme (206 Stations), et je voulais les tracer dans 1 colonne versus 8 lignes par page sur le tant de pages nécessaires. Je connais des fonctions comme viewport ou grid.arrangez, mais je ne réussis pas à les faire marcher dans ce cas. J'ai déjà remarqué que layout() nor par(mfrow=c(8,1)) ne fonctionne pas avec ggplot, mais j'envoie la partie du code où je suis coincé bellow. Toute aide serait grandement appréciée!

pdf('test.pdf', width=21, height=27)
par(mfrow=c(8,1))
for(i in levels(tab$Station))
{

print(ggplot(tab[tab$Station==i], aes(x=Date)) +
  geom_line(aes(y=Tmin), col="blue", size=0.1) + 
  geom_line(aes(y=Tmax), col="red", size=0.1) + 
  geom_text(aes(x=as.Date('2010-01-01'), y=45), label=i) +
  ylim(0, 45) + 
  scale_x_date(labels = date_format("%Y")) +
  theme_bw() +
  theme(
    plot.background = element_blank()
    ,panel.grid.major = element_blank()
    ,panel.grid.minor = element_blank()
    ,panel.border = element_rect(color = 'black')
    ,panel.background = element_blank()

  )
)

}

dev.off()
10
demandé sur José Monteiro 2013-09-28 00:48:28

4 réponses

library(plyr)
library(gridExtra)

p = ggplot(tab, aes(x=Date)) +
       geom_line(aes(y=Tmin), col="blue", size=0.1)

plots = dlply(tab , "Station", `%+%`, e1 = p)
ml = do.call(marrangeGrob, c(plots, list(nrow=8, ncol=1)))
ggsave("multipage.pdf", ml)

non testé.

10
répondu baptiste 2013-09-28 04:31:28

vous devez simplifier votre parcelle car une fois que vous obtenez le bon ordre avec une parcelle simple vous venez de la remplacer par votre compliquée. ggplot2 sont basés sur grid le paquet de sorte que vous devez utiliser gridExtra pour organiser vos parcelles. Ensuite vous bouclez , pour chaque 8 parcelles, vous les stockez dans une liste et vous appelez grid.arrange dessus, et vous répétez cela jusqu'à la fin de vos parcelles...

library(gridExtra)
library(ggplot2)
pdf('test.pdf', width=21, height=27)
i = 1
plot = list() 
for (n in unique(tab$Station)){
  ### process data for plotting here ####
  plot[[i]] = ggplot(tab[tab$Station==n], aes(x=Date)) +...
  if (i %% 8 == 0) { ## print 8 plots on a page
    print (do.call(grid.arrange,  plot))
    plot = list() # reset plot 
    i = 0 # reset index
  }
  i = i + 1
}
if (length(plot) != 0) { 
  print (do.call(grid.arrange,  plot))
}
dev.off()
1
répondu agstudy 2013-09-27 21:51:30

Le Faceting pourrait être la solution. Décidez du nombre de mini-placettes à facettes que vous voulez par page, puis faites une boucle à travers le nombre requis de fois, générant un png ou un pdf que vous allez. Donc, si vous avez 200 éléments de données et que vous voulez 50 par page, en facettes de 5 à travers et 10 vers le bas, il suffit de boucler par 200/50 = 4 itérations. Brut, mais devrait fonctionner.

facets

library(ggplot2)

ii <- 7
nn <- 49

mydf <- data.frame(date = rep(seq(as.Date('2013-03-01'),
                       by = 'day', length.out = ii), nn),
                   value = rep(runif(nn, 100, 200)))

mydf$facet.variable <- rep(1:nn, each = ii)

p <- ggplot(mydf, aes(x = date, y = value)) +
    geom_line() +
    facet_wrap(~ facet.variable, ncol = ii)

print(p)
1
répondu SlowLearner 2013-09-27 22:52:18

Malheureusement, mfrow ne fonctionne pas avec ggplot2. Vous devez utiliser d'autres méthodes comme celui-ci ou celui-ci ou utiliser le natif plot fonction.

peut-être Pouvez-vous utiliser faceting pour obtenir les 8 tracés sur une page, puis le second lien pour le mettre dans plusieurs documents...

0
répondu beroe 2017-05-23 11:53:50