2017-10-16 4 views
1

Je voudrais ajuster automatiquement les graphiques ggplot tout en traçant côte à côte.ajuster automatiquement les limites d'axe tout en traçant des parcelles séparées ensemble

library(ggplot2) 
library(gridExtra) 

set.seed(123) 
freq <- sample(1:10, 7, replace = T) 
labels <- c('AUS', 'NZ', 'ENG', 'SOC', 'PAK', 'SRI', 'IND') 
value <- paste("i",1:10,sep='') 

lab <- rep(unlist(lapply(1:length(freq), function(x) rep(labels[x],freq[x]))),2) 
ival <- rep(unlist(lapply(1:length(freq), function(x) value[1:freq[x]])),2) 

df <- data.frame(lab, ival, type=c(rep('Type1',42),rep('Type2',42)),val=runif(84,0,1)) 

Tracé des données générées en utilisant le processus aléatoire ci-dessus.

plotUng <- ggplot(df, aes(x=ival, y=val, col = type, group = type)) + 
    geom_line() + 
    geom_point(aes(x=ival, y=val)) + 
    facet_wrap(~lab, ncol=3) + 
    theme(axis.text.x=element_text(angle=45, vjust=0.3)) + 
    scale_x_discrete(limits=paste('i',1:10,sep='')) 

regroupant maintenant les données lab sur la base de certaines conditions. Maintenant, je voudrais générer une nouvelle intrigue basée sur les données groupées.

dfGrp <- df %>% mutate(lab = recode(lab, 'AUS' = 'A', 'NZ' = 'A', 'ENG' = 'A', 
            'SOC' = 'A', 'PAK' = 'B', 'SRI' = 'B')) %>% 
    group_by(lab, ival, type) %>% mutate(val = mean(val)-0.2) %>% ungroup() %>% distinct() 

plotG <- ggplot(dfGrp, aes(x=ival, y=val, col = type, group = type)) + 
    geom_line() + 
    geom_point(aes(x=ival, y=val)) + 
    facet_wrap(~lab, ncol=3) + 
    theme(axis.text.x=element_text(angle=45, vjust=0.3)) + 
    scale_x_discrete(limits=paste('i',1:10,sep='')) 

Traçage les side-by-side deux parcelles ci-dessus à titre de comparaison en utilisant grid.arrange.

grid.arrange(plotUng, plotG, ncol=2) 

enter image description here

Réglage des limites de l'axe y après une inspection manuelle de la parcelle ci-dessus que plotUng a des limites plus larges que plotG. Donc, ajusté les limites de plotG avec les limites de plotUng comme coord_cartesian(ylim = ggplot_build(plotUng)$layout$panel_ranges[[1]]$y.range).

grid.arrange(plotUng, plotG + coord_cartesian(ylim = ggplot_build(plotUng)$layout$panel_ranges[[1]]$y.range), ncol=2) 

enter image description here

L'intrigue ci-dessus est comme prévu. Existe-t-il un moyen de le faire automatiquement (juste avec les objets de la parcelle) sans inspection manuelle, car il n'est pas toujours possible d'inspecter manuellement toutes les parcelles et d'ajuster les limites de l'axe en conséquence?

Répondre

0

Ce que vous avez fait avec ggplot_build() peut être automatisé. Mais pour moi, la façon la plus simple de comparer plusieurs parcelles est de trouver les valeurs minimum et maximum pour tous les objets à comparer, puis de mettre ces valeurs comme coord_cartesian() de tous les objets. Par exemple ici:

lim_y <- c(min(df$val, dfGrp$val), max(df$val, dfGrp$val)) 

plotUng <- plotUng + coord_cartesian(ylim = lim_y) 
plotG <- plotG + coord_cartesian(ylim = lim_y) 

grid.arrange(plotUng, plotG, ncol=2) 

enter image description here

Depuis trouver les valeurs extrêmes de plusieurs colonnes est simple, cela est la façon la plus « automatisée » Je l'ai trouvé.

Notez que les coordonnées des problèmes ne se produit que pour y-limites dans ggplot

+0

Merci pour une autre approche d'identifier les limites de l'axe y et en ajustant les parcelles en fonction des nouvelles limites. Je demandais des suggestions où l'existence des méthodes automatiques ferait le nécessaire. Je voulais dire seulement avec des objets de la parcelle, l'arrangement serait fait automatiquement en ajustant les limites. – Prradep

+0

Désolé mais je ne comprends pas vraiment; que voulez-vous dire par "automatique"? –

+0

Toutes mes excuses pour vous avoir répondu en retard. Je voulais dire sans calculer le 'lim_y' après que les parcelles ont été générées. Au lieu de saisir: un ensemble de parcelles (plus de 1); sortie: disposition des intrants avec des limites ajustées. Ici, le code change lorsque l'entrée change. Je demande s'il y a des approches où la sortie change seulement quand l'entrée est changée. J'espère que c'est clair maintenant. – Prradep