2015-05-27 10 views
5

Próbuję ustawić tytuły na niektórych wykresach ggplot2, pozostawiając niektóre bez tytułów. Niestety, kiedy ustawiony jest tytuł, oś y i wykres kurczą się (patrz wykres po prawej). Muszę narysować tytuł bez zmiany wielkości osi Y, aby utytułowane wykresy były w tej samej skali z innymi (jak na środkowym wykresie).pokaż tytuł ggplot2 bez rezerwowania miejsca na to

grid.arrange(
    (ggplot(mtcars, aes(mpg, hp)) + geom_point()), 
    (ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    geom_text(aes(22.5, 340, label="fake title", vjust = 1, hjust = .5, show_guide = FALSE))), 
    (ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    labs(title="real title")), 
    ncol=3) 

plot sample

nie mogę używać fałszywych tytułów pustymi ciąg na innych działkach, bo jestem mało przestrzeni. Mogę użyć metody geom_text(), jeśli ktoś może mi powiedzieć, jak sprawić, by wyglądała na mniej zniekształconą. Jak więc usunąć wszelkie zarezerwowane miejsca dla tytułu nad fabułą, wciąż wyświetlając tytuł fabuły na górze i na górze obszaru wydruku? Ten ostatni odbywa się theme(plot.title = element_text(vjust=-1)).)

+2

Zamiast "geom_text', użyj' adnotate (geom = "text") ' – Gregor

+0

@Gregor: Skończyło się na tym, co sugerujesz, więc jeśli możesz napisać to jako odpowiedź, dam ci kredyt. Jeśli nie, zaznaczę odpowiedź Matthew Plourde jako przyjętą. –

Odpowiedz

2

annotate należy używać do tego. Jeśli użyjesz geom_text, wydrukujesz tyle etykiet, ile jest wierszy w twoich danych, stąd źle wyglądająca etykietka w twoim pytaniu. Bolesnym obejściem jest utworzenie 1-wierszowej ramki danych, która będzie używana jako dane dla warstwy geom_text. Jednakże, annotate jest przeznaczony do tego rodzaju rzeczy, więc nie potrzebujesz obejść. Coś jak:

annotate(geom = "text", x = 22.5, y = 340, label="fake title") 

to dobra praktyka. Adnotacja jest również przydatna do dodawania pojedynczych linii poziomych lub pionowych do wykresu lub do podświetlenia regionu poprzez narysowanie wokół niego prostokąta.

3

Edit Dzięki @baptiste za wskazanie bardziej zwięzły sposób, aby tego dokonać. Biorąc p1, p2 i p3 z dołu:

pl = lapply(list(p1,p2,p3), ggplotGrob) 
grid.newpage() 
grid.draw(do.call(cbind, c(pl, size="first"))) 

Original odpowiedź

Można budować grobs ggplot i standaryzacji parametr heights poprzek działek:

p1 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() 
p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + labs(title="real title") 
p3 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    geom_text(aes(22.5, 340, label="fake title", vjust = 1, hjust = .5, show_guide = FALSE)) 

p1 <- ggplot_gtable(ggplot_build(p1)) 
p2 <- ggplot_gtable(ggplot_build(p2)) 
p3 <- ggplot_gtable(ggplot_build(p3)) 

p2$heights <- p1$heights 
p3$heights <- p1$heights 

grid.arrange(p1, p2, p3, ncol=3) 

enter image description here

Następnie można użyć vjust ustawiania tytułu, aby przenieść go z działki lub dodatkowo na działce, jeśli chcesz:

p2 <- ggplot(mtcars, aes(mpg, hp)) + geom_point() + 
    labs(title="real title") + 
    theme(plot.title=element_text(vjust=-.3)) 

enter image description here

+3

gtable jest bardziej odpowiedni niż grid.arrange, 'pl = lapply (lista (p1, p2, p3), ggplotGrob); grid.newpage(); grid.draw (do.call (cbind, c (pl, size = "first"))) '. Zauważ również, że 'adnotate()' byłoby lepsze niż geom_text, ponieważ obecnie układa wiele wersji tekstu. – baptiste

+0

Dzięki, @baptiste. Zaktualizowałem odpowiedź, aby uwzględnić Twoją sugestię. –

Powiązane problemy