2016-03-01 40 views
6

C'è un modo per modificare le altezze/lunghezze dell'asse y per i singoli sfaccettature in un facet_grid o facet_wrap?Regolazione dello spazio relativo dei pannelli in una facet-grid/facet_wrap in ggplot2

Ad esempio,

library(ggplot2) 
ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) + 
    geom_line() + 
    facet_grid(variable~., scales = "free_y") + 
    theme(strip.background = element_blank()) 

enter image description here

Nel grafico sopra, desidero il tempo pop altezza serie asse y/lunghezza di essere, per esempio, due volte più grande della uempmed y- lunghezza dell'asse (2: 1), indipendentemente dal fatto che le due serie temporali abbiano scale dell'asse y diverse.

Come quello che Kohske fa qui, in una versione molto più vecchia di ggplot2, che non funziona in ggplot> = 2.0.0:

https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/

so di poter specificare l'argomento space = "free" in facet_grid , ma non penso che questo argomento possa essere usato per impostare un rapporto di asse y 2: 1?

Inoltre non voglio usare una soluzione "grid.arrange type" per allineare ggplot creati separatamente (dove posso creare i 2 grafici separati con lunghezze dell'asse y diverse), perché preferirei fare uso delle funzioni ggplot2 interattive di Shiny in questo singolo grafico facet_wrap (ad esempio un esempio di sfaccettatura lucida interattiva con un pennello è a metà della pagina qui: http://shiny.rstudio.com/articles/selecting-rows-of-data.html).

+1

Hai mai trovato una soluzione per il vostro problema? Sto chiedendo come ho la stessa identica domanda. E cosa fare quando hai 3 griglie e le vuoi in un rapporto (2, 1, 1). È abbastanza facile da fare con il parametro grid_extra e le altezze, ma non si allineano bene in verticale – Franky

+0

Sfortunatamente non ancora. Forse c'è un modo, in particolare con gli aggiornamenti di ggplot2 nell'ultimo anno o giù di lì, ma non ne sono consapevole. La mia ipotesi è che probabilmente ha ancora bisogno di essere implementata nel sorgente ggplot2, cosa che non mi è affatto familiare. – FXQuantTrader

risposta

1

Ci sono più opzioni.

Con facets, è possibile utilizzare facet_grid(..., space='free_y') per regolare l'altezza di ogni riga in base alla lunghezza della scala Y. Nel set di dati, tuttavia, la riga inferiore viene ridotta a una singola riga (0-25 vs 200.000 - 320.000).

Quando gli oggetti ggplot2 sono tracciati/stampati, vengono prima convertiti in oggetti gtable. Salvando la tua trama come p, possiamo chiamare ggplotGrob per ottenere l'oggetto Gtable. Questa è una procedura a senso unico; una volta convertito, non puoi convertire il gtable in un oggetto ggplot2!

(g <- ggplotGrob(p)) 
TableGrob (12 x 8) "layout": 18 grobs 
    z   cells  name         grob 
1 0 (1-12, 1- 8) background  rect[plot.background..rect.3766] 
2 1 (6- 6, 4- 4) panel-1-1    gTree[panel-1.gTree.3696] 
3 1 (8- 8, 4- 4) panel-1-2    gTree[panel-2.gTree.3711] 
4 3 (5- 5, 4- 4) axis-t-1       zeroGrob[NULL] 
5 3 (9- 9, 4- 4) axis-b-1 absoluteGrob[GRID.absoluteGrob.3725] 
6 3 (6- 6, 3- 3) axis-l-1 absoluteGrob[GRID.absoluteGrob.3733] 
7 3 (8- 8, 3- 3) axis-l-2 absoluteGrob[GRID.absoluteGrob.3741] 
8 3 (6- 6, 6- 6) axis-r-1       zeroGrob[NULL] 
9 3 (8- 8, 6- 6) axis-r-2       zeroGrob[NULL] 
10 2 (6- 6, 5- 5) strip-r-1       gtable[strip] 
11 2 (8- 8, 5- 5) strip-r-2       gtable[strip] 
12 4 (4- 4, 4- 4)  xlab-t       zeroGrob[NULL] 
13 5 (10-10, 4- 4)  xlab-b titleGrob[axis.title.x..titleGrob.3714] 
14 6 (6- 8, 2- 2)  ylab-l titleGrob[axis.title.y..titleGrob.3717] 
15 7 (6- 8, 7- 7)  ylab-r       zeroGrob[NULL] 
16 8 (3- 3, 4- 4) subtitle zeroGrob[plot.subtitle..zeroGrob.3763] 
17 9 (2- 2, 4- 4)  title  zeroGrob[plot.title..zeroGrob.3762] 
18 10 (11-11, 4- 4) caption zeroGrob[plot.caption..zeroGrob.3764] 

Tutti gli elementi sono impostati in un layout a griglia. L'altezza di ogni riga nel layout è dato da g$heights:

> g$heights 
[1] 5pt     0cm     0cm     0cm     0cm     1null    5pt     1null    0.396281911581569cm 1grobheight   
[11] 0cm     5pt  

Partita la coordinata del 'panel-1-1' e 'panel-1-2' a queste altezze, e troverete il 6 ° e l'ottavo elemento sono entrambi 1null. Puoi cambiarli in qualsiasi unità, cm, in, pt, ... Lo 1null è semplicemente ciò che rimane dopo gli altri elementi e diviso tra loro. Così possiamo cambiare il 6 ° altezza per 2null (notare l'uso delle doppie parentesi quadre):

> g$heights[[6]] <- unit(2, 'null') 
> grid.draw(g) 

enter image description here

+0

Grazie, sono a conoscenza di questo approccio per la creazione di ggplot (ho menzionato le soluzioni di tipo 'grid.arrange' nella domanda). Ma non penso che questo in realtà risponda alla mia specifica domanda ... Mi piacerebbe in ultima analisi essere in grado di regolare l'asse y in facet_wrap, così posso usare i grafici ggplot2 interattivi all'interno di Shiny ... Vedi l'esempio dei punti spazzolati con il 'facet_wrap' nel link rstudio che ho nella domanda. Non sono a conoscenza che qualcosa del genere sia possibile anche usando 'grob's – FXQuantTrader

+0

Non è chiaro come funziona BrushedPoints; la mia ipotesi è che non riconosce i singoli punti sulla trama, ma estrapola le coordinate X e Y coperte e restituisce qualsiasi punto dal dato data.frame che rientra nella regione. Si noti che la funzione non legge il data.frame dall'oggetto ggplot, ma deve essere dato esplicitamente; Inoltre devi specificare quali facet sono in uso. Avrai un sacco di lavoro da ritagliare se proverai a combinare queste due funzioni nel modo in cui stai provando; prova invece a utilizzare due dispositivi di stampa di output separati. – MrGumble