2015-01-22 10 views
6

facet_grid me jede Facette Breite Größe ermöglichen je nach Anzahl der Elemente auf der Y-Achse (space Argument):'Labels auf' mit facet_grid oder 'space-Option' mit facet_wrap

df <- data.frame(label = c("Variable one", rep("Variable two", 2), rep("Variable three", 3)), item = c("A", "B", "C", "D", "E", "F"), value = rnorm(6)) 
ggplot(df, aes(x = value, y = item)) + 
geom_point() + 
facet_grid(label ~ ., scales = "free_y", space = "free_y") + 
ylab("") + 
theme(strip.text.y = element_text(angle=0)) 

enter image description here

Aber ich würde Facette Etiketten auf der Oberseite gefallen, so dass ich wechsle facet_wrap und verlor das space Argument (Facetten alle die gleiche Breite hat):

ggplot(df, aes(x = value, y = item)) + 
geom_point() + 
facet_wrap(~ label, scales = "free_y", ncol = 1) + 
ylab("") 

enter image description here

Ist es möglich, das Beste aus beiden Welten zu erhalten?

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

3

Es kann manuell erfolgen. Das Verhältnis der Höhen der drei Platten in der gewünschten Fläche beträgt ungefähr 1: 3: 2. kann

library(ggplot2) 
library(grid) 
df <- data.frame(label = c("Variable one", rep("Variable two", 2), rep("Variable three", 3)), item = c("A", "B", "C", "D", "E", "F"), value = rnorm(6)) 

p1 = ggplot(df, aes(x = value, y = item)) + 
geom_point() + 
facet_wrap(~ label, scales = "free_y", ncol = 1) + 
ylab("") 

g1 = ggplotGrob(p1) 

g1$heights[[7]] = unit(1, "null") 
g1$heights[[12]] = unit(3, "null") 
g1$heights[[17]] = unit(2, "null") 

grid.newpage() 
grid.draw(g1) 

Oder die Höhen eingestellt werden, die gleichen wie diejenigen in dem ursprünglichen Plot sein: Die Höhen der drei Platten kann durch Änderung der Grobs eingestellt werden

p2 = ggplot(df, aes(x = value, y = item)) + 
geom_point() + 
facet_grid(label ~ ., scales = "free_y", space = "free_y") + 
ylab("") + 
theme(strip.text.y = element_text(angle=0)) 

g2 = ggplotGrob(p2) 

g1$heights[[7]] = g2$heights[[6]] 
g1$heights[[12]] = g2$heights[[8]] 
g1$heights[[17]] = g2$heights[[10]] 

grid.newpage() 
grid.draw(g1) 

Oder die Höhen kann ohne Bezug auf die ursprüngliche Handlung eingestellt werden. Sie können entsprechend der Nummer items für jede label in df eingestellt werden. Und von @baptiste's answer here einige Code zu leihen die Elemente aus dem Layout zu wählen, um die Platten entsprechen:

# From 'df', get the number of 'items' for each 'label'. 
# That is, the number y-breaks in each panel. 
library(plyr) 
N = dlply(df, .(label), function(x) length(row.names(x))) 

# Get the items in the g1 layout corresponding to the panels. 
panels1 <- g1$layout$t[grepl("panel", g1$layout$name)] 

# Replace the default panel heights with relative heights 
g1$heights[panels1] <- unit(N, "null") 

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

enter image description here

4

Ich weiß nicht, wie es in ggplot zu tun, aber Sie können ein ähnliches Layout mit einem ggplot oid Stil erreichen mit latticeExtra:

library(latticeExtra) 
df$label <- factor(df$label, levels = unique(df$label)) 

dotplot(item ~ value | label, data = df, 
     layout = c(1, 3), 
     as.table = TRUE, 
     scales = list(y = list(relation = "free")), 
     par.settings = ggplot2like()) 
resizePanels() 

enter image description here

Verwandte Themen