2015-07-22 43 views
11

Ho bisogno di sfaccettature di larghezza diversa; il grafico di sinistra mostra la gamma dinamica di un esperimento e la destra ha le condizioni di prova. C'è un modo per avere bilance x e y gratuite con facet_wrap? È possibile in facet_grid, ma anche con scale = "free", c'è una scala y fissa. facet_wrap consente la scala y gratuita, ma la scala x sembra fissa. La stessa domanda è stata pubblicata su una pagina di Google qualche anno fa, ma la risposta è insoddisfacente. https://groups.google.com/forum/#!topic/ggplot2/1RwkCcTRBAwimposta "spazio" in facet_wrap come in facet_grid

Scusate se anche qui è una ripetizione; ogni aiuto sarebbe molto apprezzato!

mdf <- read.table(text=" 
    strain val  type 
1  1 0.0000 sample 
2  1 0.0140 sample 
3  1 0.0175 sample 
4  2 0.0025 sample 
5  2 0.0260 sample 
6  2 0.0105 sample 
7  3 0.0190 sample 
8  3 0.0725 sample 
9  3 0.0390 sample 
10  4 0.0560 sample 
11  4 0.0695 sample 
12  4 0.0605 sample 
13  5 0.0735 sample 
14  5 0.1065 sample 
15  5 0.0890 sample 
16  6 0.1135 sample 
17  6 0.2105 sample 
18  6 0.1410 sample 
19  7 0.1360 sample 
20  7 0.2610 sample 
21  7 0.1740 sample 
22  8 0.3850 control 
23  8 0.7580 control 
24  8 0.5230 control 
25  9 0.5230 control 
26  9 0.5860 control 
27  9 0.7240 control") 

library(ggplot2) 

p<-ggplot(mdf, aes(reorder(strain, val), val))+ 
    labs(x="Strain", y="intensity")+ 
    geom_boxplot()+ 
    geom_point()+ 
    facet_grid(~type, scales ="free", space="free_x") 
p 
## free x, fixed y. why? 

q<-ggplot(mdf, aes(reorder(strain, val), val))+ 
    labs(x="Strain", y="intensity")+ 
    geom_boxplot()+ 
    geom_point()+ 
    facet_wrap(~type, scales ="free") 
q 
## free y, fixed x. why? 

risposta

9

Non posso esserne assolutamente certo, ma penso che la risposta sia no - con i comandi ggplot2. Non penso sia una buona idea neanche perché potrebbe non essere ovvio per un lettore che le scale sugli assi y sono differenti. Tuttavia, se è necessario disporre della trama, è possibile regolare le larghezze dei pannelli della trama q utilizzando il layout ggplot di grob. Nota che il primo pannello ha due valori x e il secondo pannello ha sette valori x. Quindi cambia le larghezze predefinite dei pannelli rispettivamente a 2 nulli e a 7 noli.

Edit: Aggiornamento a ggplot2 2.2.0

library(ggplot2) 
library(grid) 
# get mdf data frame from the question 

# Your q plot 
q <- ggplot(mdf, aes(factor(strain), val)) + 
    labs(x = "Strain", y = "intensity") + 
    geom_boxplot() + 
    geom_point() + 
    facet_wrap(~ type, scales = "free") 
q 

# Get the ggplot grob 
gt = ggplotGrob(q) 

# Check for the widths - you need to change the two that are set to 1null 
gt$widths 
# The required widths are 4 and 8 

# Replace the default widths with relative widths: 
gt$widths[4] = unit(2, "null") 
gt$widths[8] = unit(7, "null") 

# Draw the plot 
grid.newpage() 
grid.draw(gt) 

# I think it is better to have some extra space between the two panels 
gt$widths[5] = unit(1, "cm") 
grid.newpage() 
grid.draw(gt) 

Oppure, ottenere R per determinare le relative larghezze e dei pannelli.

gt = ggplotGrob(q) 

# From 'dfm', get the number of 'strain' for each 'type'. 
# That is, the number x-breaks in each panel. 
library(dplyr) 
N <- mdf %>% group_by(type) %>% 
    summarise(count = length(unique(strain))) %>% 
    `[[`(2) 

# Get the column index in the gt layout corresponding to the panels. 
panelI <- gt$layout$l[grepl("panel", gt$layout$name)] 

# Replace the default panel widths with relative heights. 
gt$widths[panelI] <- unit(N, "null") 

# Add extra width between panels (assuming two panels) 
gt$widths[panelI[1] + 1] = unit(1, "cm") 

## Draw gt 
grid.newpage() 
grid.draw(gt) 

enter image description here

+0

grazie, questo è davvero l'ideale. Questa soluzione è la soluzione più semplice per le domande "dual scale in ggplot" o "faccette variabili" che ho visto; Spero che anche altri lo trovino utile. – NWaters

4

Inoltre, per coloro che cercano di utilizzare @ risposta di Sandy con dplyr:

library(dplyr) 
N<-mdf%>% group_by(type)%>% summarise(count = length(unique(strain))) 

# Get the column index in the gt layout corresponding to the panels. 
panelI <- gt$layout$l[grepl("panel", gt$layout$name)] 

# Replace the default panel widths with relative heights. 
gt$widths[panelI] <- lapply(N$count, unit, "null")