2013-07-04 13 views
10

Próbuję wyrównać lewą i prawą krawędź 4 map kartogramowych ggplot, używając this method. Nie jestem jednak w stanie tego zrobić.Wyrównaj krawędzie goplotu ggplota (zmienia się tytuł legendy)

Oryginalna fabuła:

library(ggplot2); library(gridExtra) 
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests) 
states_map <- map_data("state") 
plot1 <- ggplot(crimes, aes(map_id = state)) + 
    geom_map(aes(fill = Murder), map = states_map) + 
    expand_limits(x = states_map$long, y = states_map$lat) + 
    scale_fill_gradient(low="white", high="darkgreen", name="Really Long Name 1") 


plot2 <- plot1 + scale_fill_gradient(name="Really Long Name 2 and then some") 
plot3 <- plot1 + scale_fill_gradient(name="Short 3") 
plot4 <- plot1 + scale_fill_gradient(name="Really Long Name 4") 

grid.arrange(plot1, plot3, plot2, plot4, ncol = 2) 

Próba wyrównać krawędzie wydruku (taki sam wynik):

p1 <- ggplotGrob(plot1) 
p2 <- ggplotGrob(plot2) 
p3 <- ggplotGrob(plot3) 
p4 <- ggplotGrob(plot4) 

maxWidth <- grid::unit.pmax(p1$widths[2:3], p2$widths[2:3], p3$widths[2:3], p4$widths[2:3]) 
p1$widths[2:3] <- as.list(maxWidth) 
p2$widths[2:3] <- as.list(maxWidth) 
p3$widths[2:3] <- as.list(maxWidth) 
p4$widths[2:3] <- as.list(maxWidth) 

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

enter image description here

PS: Załóżmy, że trzeba użyć siatki zorganizować i legendy nie są w rzeczywistości tej samej skali, więc facet_grid jest na zewnątrz itp

+1

Jeśli jest to tylko tytuł legendy, że jest kwestia, czy uważa się za umieszczenie go poziomo w górnej lub dolnej ? To znaczy. 'plot1 + theme (legend.position = 'bottom', legend.direction = 'horizontal')' – MrGumble

+0

zgodnie z sugestiami zamieszczonymi w komentarzach do opublikowanego linku, prawdopodobnie chciałbyś użyć 'widths [2: 5]' legenda w porównaniu jednostek. Zwróć uwagę, że spowoduje to wyśrodkowanie tej samej legendy, co w pierwszej odpowiedzi @ kohske, ponieważ grob prowadzący ustawia się w przydzielonej rzutni. – baptiste

+0

Próbowałem "szerokości [2: 5]", co spowodowało bardzo dziwne miejsca docelowe. –

Odpowiedz

9

Oto przykład:

library(gtable) 
grid.draw(cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first")) 

enter image description here


Updated

To zły hack, więc nie polecam używać. Prawdopodobnie to nie zadziała w przyszłości.

gt <- cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first") 
for (i in which(gt$layout$name == "guide-box")) { 
    gt$grobs[[i]] <- gt$grobs[[i]]$grobs[[1]] 
} 
grid.draw(gt) 

enter image description here

+2

+1 Dobre rozwiązanie. Zastanawiam się, czy możliwe jest również dostosowanie legend, tak, że wzrasta tylko przestrzeń po prawej stronie wykresów. –

+2

@SvenHohenstein patrz zaktualizowany, ale nie polecam go używać. – kohske

+0

Skąd pochodzi 'gt'? –

1

Korzystanie cowplot pakiet:

library(cowplot) 
plot_grid(plot1, plot3, plot2, plot4, ncol = 2, align = "v") 

enter image description here

Powiązane problemy