2015-07-16 12 views
6

Desidero combinare due ggplots con grid.arrange con una sola legenda generale. Sono riuscito a combinare le due leggende con un piccolo trucco, ma poiché ho rimosso la legenda dal primo grafico, questo è più ampio dopo grid.arrange, ovviamente. Come posso ottenere entrambe le aree di tracciamento alla stessa dimensione? E vorrei anche avere un'etichetta dell'asse x comune centrata sotto entrambi i grafici. è possibile con grid.arrange? Lo so, a domande simili è stata data una risposta prima, ma sono ancora un novellino di R e le soluzioni sono troppo complicate o non posso adattarle ai miei dati.Combina grafici con grid.arrange e regola la dimensione del grafico e l'etichetta dell'asse

Così qui sono i miei due set di dati:

testxy 
    SN strain  est  low  up 
1 A  xy 11.6751 11.1480 12.2021 
2 B  xy 11.4211 11.1108 11.7314 
3 C  xy 2.6603 2.4291 2.8915 
4 D  xy 4.5503 4.2972 4.8034 

testyz 
    SN strain  est  low  up 
5 A  yz 22.1761 21.5136 22.8387 
6 C  yz 21.4829 21.0251 21.9408 
7 B  yz 19.3294 18.8950 19.7639 
8 D  yz 19.9990 19.3934 20.6047 

E questo è il codice che ho finora. È vicino a quello che voglio, ma proprio vicino:

p1<-ggplot(data=testxy, aes(colour=strain, x=SN, y=est))+ 
theme(panel.background = element_rect(fill = 'white', colour = 'black'))+ 
theme(legend.position="none")+ 
theme(axis.title.x = element_text(size = rel(1.5), vjust=-0.1), 
axis.title.y = element_text(size = rel(1.5), vjust=1), axis.text.y = element_text(size = rel(1.4)), axis.text.x = element_text(hjust = 1, size = rel(1.5)),plot.title = element_text(size = rel(2.5), lineheight=1, face="bold"))+ 
     theme(plot.margin=unit(c(5,5,5,5),"mm"))+ 
     labs(x="treatment", y="integral", title="xy")+ 
     scale_colour_manual(name="strain", values=c(xy="blue"))+ 
     theme(strip.text.x = element_text(size=12, face="bold"), strip.background = element_rect(colour="black", fill="white"))+ 
     geom_point(aes(color="xy"), size=5, alpha=0.1, shape=16)+ 
     geom_errorbar(aes(ymin=low, ymax=up, width=0.2), colour="deepskyblue", size=0.8)+ 
     scale_y_continuous(breaks=seq(5,20,5), limits=c(2,23.5)) 

p2<-ggplot(data=testyz, aes(colour=strain, x=SN, y=est))+ 
    theme(panel.background = element_rect(fill = 'white', colour = 'black'))+ 
    theme(legend.position="right")+ 
    theme(axis.title.x = element_text(size = rel(1.5), vjust=-0.1), axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_text(hjust = 1, size = rel(1.5)), plot.title = element_text(size = rel(2.5), lineheight=1, face="bold"))+ 
    theme(plot.margin=unit(c(5,5,5,5),"mm"))+ 
    labs(x="treatment", y=NULL, title="yz")+ 
    scale_colour_manual(name="strain", values=c(yz="green", xy="blue"))+ 
    theme(strip.text.x = element_text(size=12, face="bold"), strip.background = element_rect(colour="black", fill="white"))+ 
    geom_point(aes(color="yz"), size=5, alpha=0.1, shape=16)+ 
    geom_point(aes(color="xy"), size=0)+ 
    geom_errorbar(aes(ymin=low, ymax=up, width=0.2), colour="green", size=0.8)+ 
    scale_y_continuous(breaks=seq(5,20,5), limits=c(2,23.5))+ 
    scale_x_discrete(limits=c("A", "C", "B", "D")) 

grid.arrange(p1,p2, ncol=2) 

Ho provato sfaccettatura prima. Sembra davvero buono, ma sfortunatamente, ho bisogno di cambiare l'ordine dello levels sugli assi x. Quindi, penso che lo sfaccettatura non funzioni per me.

Spero che tu possa aiutarmi.

Acclamazioni Anne

+0

Se usi dput con i tuoi dati, posso sperimentare più facilmente la mia R (se lo fai oltre alla stampa dei dati, possiamo leggere e sperimentare facilmente). Non sono sicuro del motivo per cui l'uso della sfaccettatura non funzionerebbe; sembra giusta soluzione. – kasterma

+0

Anne, benvenuto in SO e buon primo post! –

+0

Vedere [questa risposta] (http://stackoverflow.com/a/28594060/1412059)? – Roland

risposta

1

Si dovrebbe usare sfaccettatura:

testxy <- read.table(text = " SN strain  est  low  up 
1 A  xy 11.6751 11.1480 12.2021 
2 B  xy 11.4211 11.1108 11.7314 
3 C  xy 2.6603 2.4291 2.8915 
4 D  xy 4.5503 4.2972 4.8034", header = TRUE) 

testyz <- read.table(text = " SN strain  est  low  up 
5 A  yz 22.1761 21.5136 22.8387 
6 C  yz 21.4829 21.0251 21.9408 
7 B  yz 19.3294 18.8950 19.7639 
8 D  yz 19.9990 19.3934 20.6047", header = TRUE) 

test <- rbind(cbind(testxy, fac = "xy"), 
       cbind(testyz, fac = "yz")) 


test$SN1 <- interaction(test$SN, test$fac) 
test$SN1 <- ordered(test$SN1, levels = test$SN1) 


ggplot(data=test, aes(colour=strain, x=SN1, y=est)) + 
    geom_point() + 
    facet_wrap(~ fac, scales = "free_x") + 
    scale_x_discrete(labels = setNames(as.character(test$SN), as.character(test$SN1))) 

resulting plot

Tuttavia, questo non è una buona trama, in quanto il lettore spesso si accorge che gli X-assi sono diversi.

+0

Grazie, Roland! Ha funzionato ora. Questa soluzione è fantastica :-) – Anne

0

Se l'unico problema della sfaccettatura è l'ordine dei livelli, che possono essere risolti riordinando la tua prima ggplot2 chiamare fattore variabile.

È possibile specificare l'ordine dei livelli di un fattore durante la conversione in un fattore.

df = rbind(testxy, testyz) 
df$strain <- factor(as.character(df$strain), levels=c('yz','xy')) 
ggplot(df, aes(colour=strain, x=SN, y=est))+facet_grid(.~strain) 
+0

Grazie per il tuo intervento. Sfortunatamente, questa non è una soluzione. L'ordine del trattamento sugli assi x deve essere diverso. Per "testxy" questo deve essere A, B, C, D e per "testyz" è A, C, B, D. Ho cambiato l'ordine già nei dataframes ma ggplot lo ordina alfabeticamente in entrambi i grafici su A, B, C, D. – Anne

+0

Se il tuo SN è veramente A, B, C e D, devo assolutamente raccomandare di scambiare due indici sugli assi x adiacenti, poiché approssima l'ingannare lo spettatore! Se B in xy differisce da B in yz, allora chiamali due cose diverse (ad esempio Bx e By). Quindi riordina i livelli del fattore come A, Bx, C, By, D, e prova a usare '' facet_grid (. ~ Strain, scale = 'free_x') '' per forzare ggplot a riqualificare la scala x per ogni sfaccettatura. – MrGumble

Problemi correlati