2015-09-06 9 views
13

To może przede wszystkim wynikać z mojego niezrozumienia, jak działa panel.margin = unit(...) w funkcji theme() ... ale nie mogę dostosować marginesów w facja_wrap tak, jakbym chciał. Zasadniczo chcę, aby facet_grid wyglądał w ten sposób, z tekstem aspektu (tj. strip.text) wstawionym w każdym elemencie i bez spaczania między poszczególnymi aspektami:W ggplot2 i facet_wrap, jak usunąć wszystkie marginesy i dopełnienie, ale zachować strip.text?

(Zostawiłem w różowych obramowaniach, aby pokazać wymiary każdego aspektu)

The ideal final product

więc oto kod do tej pory.

Konfiguracja danych i wykresu:

library(ggplot2) 
library(grid) 
p <- ggplot() + 
    geom_bar(data = mtcars, aes(x = cyl, y = qsec), stat = 'identity') + 
    facet_wrap(~ carb, ncol = 3) 

mytheme <- theme_minimal() + theme(
    axis.text.x = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks = element_blank(), 
    axis.title = element_blank(), 
    panel.margin = unit(0, "lines"), 
    panel.border = element_rect(colour = rgb(1.0, 0, 0, 0.5), fill=NA, size=1) 
) 
Standardowe wykres
p + mytheme 

just a standard plot

wyjmowanie strip.text całkowicie
p + mytheme + theme(strip.text = element_blank()) 

no strip text

Dodanie strip.text i insetting to
p + mytheme + 
    theme(strip.text = element_text(size = rel(3.0), vjust = -4.0)) 

test grid inset text

Ponowne inkluzyjnego strip.text (i zwiększony rozmiar względna) zwiększa margines pionie pomiędzy dwoma rzędami. W tym momencie nie wiem, jak zamknąć pionową lukę między górnym i dolnym rzędem.

Zbyt dużo ujemny margines
p + mytheme + 
    theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
      panel.margin = unit(c(-2, -2), "lines")) 

Too much negative margin

Więc jak mam kierować tylko panel.margin pomiędzy dwoma rzędami?

Edytuj: Dodatkowe informacje. Przestrzeń pomiędzy rzędami wydaje się być strip.background:

p + mytheme + 
     theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
       panel.margin = unit(-1, "lines"), 
       strip.background = element_rect(fill = rgb(0, 1.0, 0, 0.2))) 

enter image description here

+2

Jeśli używasz 'panel.margin.y = jednostka (-2, "linie") ', zmniejszasz tylko odstęp między wierszami. Czy tego właśnie szukałeś, czy było coś jeszcze? – maj

+0

@maj ... to ... nie może być takie proste ... ale tak było. Chyba przegapiłem to gdzieś w dokumentacji. Czy możesz odrzucić swój komentarz jako odpowiedź, abym mógł go zaakceptować? –

+0

@maj w moim systemie Potrzebuję 'panel.margin.y = unit (-0.5," lines ")', aby uzyskać pożądany wynik – Jaap

Odpowiedz

7

Wśród listy możliwych argumentów theme(), jest nie tylko panel.margin („margines wokół paneli facet (część)”, zob ?theme) , ale wygodnie, można również uzyskać dostęp do jednej z osi na raz, odpowiednio z panel.margin.x i panel.margin.y ("margines poziomy/pionowy wokół paneli warstw (jednostka, dziedziczy z panelu.margin)").

Dlatego, jednocześnie zmniejszając margines poniżej zera czuje się trochę jak hack, coś jak poniżej wykona pracę (może trzeba ustawić wartość trochę - unit(-2, "lines") pracował dla mnie najlepsza):

p + theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
      panel.margin.y = unit(-2, "lines")) 

Jeśli używasz strip.text = element_blank(), powinieneś prawdopodobnie używać panel.margin.y = unit(-0.5, "lines").

Powiązane problemy