Tworzę grafikę przy użyciu facet_grid
, aby wymusić zmienną kategoryczną na osi Y. Zdecydowałem się nie używać facet_wrap
, ponieważ potrzebuję space = 'free'
i labeller = label_parsed
. Moje etykiety są długie i mam legendę po prawej, więc chciałbym przenieść etykiety z prawej strony panelu na górę panelu.ggplot2: Używanie gtable do przesuwania etykiet paska do górnej części panelu dla facet_grid
Oto przykład pokazujący, gdzie utknąłem.
library(ggplot2)
library(gtable)
mt <- ggplot(mpg, aes(x = cty, y = model)) + geom_point() +
facet_grid(manufacturer ~ ., scales = 'free', space = 'free') +
theme_minimal() +
theme(panel.margin = unit(0.5, 'lines'), strip.text.y = element_text(angle = 0))
Teraz chciałbym, aby przenieść tekst paska z prawej strony każdego panelu na górze każdego panelu. Mogę zapisać grobs dla etykiet paskowych i usunąć je z działki:
grob <- ggplotGrob(mt)
strips.y <- gtable_filter(grob, 'strip-right')
grob2 <- grob[,-5]
Ale teraz utknąłem, jeśli chodzi o rbind
-ing z grobs powrotem więc etykiety iść do górnej części paneli.
Innym możliwym rozwiązaniem byłoby wykorzystanie facet_wrap
a następnie re-size panele as discussed in another question, ale w takim razie będę musiał ręcznie zmienić etykiety na ścianach, ponieważ nie ma labeller = label_parsed
dla facet_wrap
.
Byłbym wdzięczny za sugestie na temat obu metod!
Dzięki za czytanie,
Tom
To jest fantastyczne, dziękuję.Właśnie wprowadziłem kilka drobnych zmian w twoim pierwszym podejściu, dzięki czemu mogłem go przekształcić w funkcję: 'for (i in 1: length (strips $ t)) gt = gtable_add_grob (gt, stripText $ grobs [[i ]], t = panele $ t [i] -1, l = 4, r = 4) ' -> ' for (i in 1: length (strips $ t)) gt = gtable_add_grob (gt, stripText $ grobs [[i]], t = panele $ t [i] -1, l = min (panele $ l), r = max (panele $ r)) ' aby wstawić nowy pasek grobs i ' gt = gt [ , -5] ' -> ' gt <- gt [, - c (min (paski $ l), max (paski $ r))] ' , aby usunąć stare paski. –