2015-05-16 13 views
8

I miei dati:Y-limits diversi sul grafico a barre della griglia facce ggplot?

day variable  value 
1 Fri  avg1 446.521127 
2 Mon  avg1 461.676056 
3 Sat  avg1 393.366197 
4 Sun  avg1 435.985714 
5 Thu  avg1 445.571429 
6 Tue  avg1 441.549296 
7 Wed  avg1 462.042254 
8 Fri  avg2 7.442113 
9 Mon  avg2 7.694648 
10 Sat  avg2 6.556056 
11 Sun  avg2 7.266571 
12 Thu  avg2 7.426286 
13 Tue  avg2 7.359577 
14 Wed  avg2 7.700282 

Il mio problema è che voglio creare un grafico a barre con facet_grid visualizzazione di ogni serie di dati avg di giorno, ma le osservazioni sono abbastanza simili che ho trovato utile per specificare la y -limiti usando scale_y_continuous.

Quindi, se il mio assegno ggplot a g <- ggplot(df, aes(x=day, y=value)), posso ottenere la metà di quello che voglio da ciascuno di:

g + geom_bar(stat="identity") + facet_grid(variable~., scales="free") 

E

g + geom_bar(stat="identity") + scale_y_continuous(limits=c(300,500), oob=rescale_none) 

Tuttavia, non so come utilizzare la griglia di sfaccettatura e quindi specificare un parametro scale_y_cont che limiterà la dimensione degli assi y separati. C'è una soluzione?

+0

Stai dicendo che non vuoi che il limite y inferiore di ogni facet sia zero? – eipi10

+0

right, voglio che il limite inferiore sia qualcosa di simile al "mean" del range – knl

+0

Quindi vuoi che il limite inferiore di facet 'avg1' sia all'incirca 0.5 * max (avg1) e il limite inferiore di facet' avg2' a essere all'incirca 0,5 * max (avg2)? Ti consiglio di non utilizzare un grafico a barre se non vuoi che la scala y scenda a zero, poiché le differenze relative tra le altezze della barra saranno ingannevolmente grandi. – eipi10

risposta

8

È possibile creare intervalli y separati per diversi aspetti quando si utilizza geom_point, ma non conosco un modo per farlo con geom_bar. Per impostare intervalli y specifici con facet_wrap e geom_bar, l'unico modo che conosco è creare grafici separati e quindi inserirli uno accanto all'altro utilizzando grid.arrange dal pacchetto . (Usare una scala verticale che non scenda a zero esagera le differenze tra punti/barre, che possono essere fuorvianti, ma dovrai decidere se ha senso per il tuo caso particolare.)

Primo, ecco la versione geom_point: L'idea è di creare un frame dati "fittizio" con i valori inferiore e superiore desiderati per ylim e quindi "tracciarli" usando geom_blank. geom_blank non traccia nulla, ma l'aggiunta di questa geom assicurerà che l'intervallo dell'asse sia quello che vuoi che sia per ogni sfaccettatura.

ddummy = data.frame(day=NA, variable=rep(c("avg1", "avg2"), each=2), 
       value=c(0.5*max(df$value[df$variable=="avg1"]), 
         1.1*max(df$value[df$variable=="avg1"]), 
         0.5*max(df$value[df$variable=="avg2"]), 
         1.1*max(df$value[df$variable=="avg2"]))) 

g <- ggplot(df, aes(x=day, y=value)) 

g + geom_point() + 
    geom_blank(data=dummy, aes(day, value)) + 
    facet_grid(variable ~ ., scales="free") 

enter image description here

e qui ci sono trame distinte, messo insieme con grid.arrange:

avg1 = ggplot(df[df$variable=="avg1",], aes(x=day, y=value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable) + 
    coord_cartesian(ylim=c(300,500)) 

avg2 = ggplot(df[df$variable=="avg2",], aes(x=day, y=value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable) + 
    coord_cartesian(ylim=c(3.5,8)) 

gridExtra::grid.arrange(avg1, avg2, ncol=2) 

enter image description here

Per utilizzare geom_segment (per il tuo commento) si potrebbe fare questo:

library(dplyr) 

ggplot(df %>% group_by(variable) %>% 
     mutate(ymin=0.5*max(value))) + 
    geom_segment(aes(x=day, xend=day, y=ymin, yend=value), 
       size=5, colour=hcl(195,100,65)) + 
    facet_grid(variable ~ ., scales="free") 
+0

Eccellente. Perché la gamma y non è applicata su un grafico a barre come con 'geom_point'? – knl

+0

Sono sicuro che è perché 'geom_bar'" presume che "la barra dovrebbe scendere a zero, quindi l'intervallo effettivo dei" dati "' geom_bar' sta implicitamente utilizzando da zero a massimo (ydata). L'aggiunta di un frame di dati fittizio con un intervallo y sopra lo zero non lo modifica, pertanto non modifica il grafico. Tuttavia, se cambi il '0.5' nel mio frame dati fittizio a' -0.5', vedrai che 'geom_bar' espande la gamma y sotto zero, perché ora hai espanso efficacemente la gamma y della trama . – eipi10

+0

oh, certo.Se tracciate 'geom_point' senza il manichino, ottenete un risultato simile. Mi chiedo se potresti usare 'geom_segment' per tracciare da max (avg1/2)/2 al valore. – knl

Problemi correlati