2015-02-21 9 views
5

Podczas korzystania z facet_grid, ggplot2 dzieli główne kategorie, które składają się na zmienne aspektów z szerszą niż zwykle białą linią. To służy większości celów. Czasami chcę wyraźniej wskazać podziały między tymi głównymi kategoryzacjami i chciałbym zacienić podział aspektu za pomocą innego koloru. Czy jest jakiś sposób na zrobienie tego? Dzięki.Jak zmienić kolor krawędzi aspektów przy użyciu facet_grid

Odpowiedz

6

Chociaż roku późno, uważam, że jest to łatwo naprawić:

ggplot(mpg, aes(cty, hwy, color = factor(year)))+ 
    geom_point()+ 
    facet_grid(cyl ~ drv) + 
    theme(panel.margin=unit(.05, "lines"), 
     panel.border = element_rect(color = "black", fill = NA, size = 1), 
     strip.background = element_rect(color = "black", size = 1)) 

facet wrap example

+0

To wygląda na proste rozwiązanie, ale nie sądzę, że może ono być uogólnione na wszystkie sytuacje. Co się stanie, jeśli chce się więcej miejsca między panelami? Lub nawet domyślny margines panelu? Rozmiar linii granicznych panelu musi zostać zwiększony. Ale wtedy grubsze linie graniczne są rysowane wewnątrz i na zewnątrz panelu.Fabuła nie tylko wygląda brzydko, ale ostatecznie traci informacje; na przykład, z wystarczająco grubą linią, górne prawe punkty w środkowym panelu w górnym rzędzie znikają pod linią graniczną. –

+0

A może ktoś chce mieć kolor inny niż czarny? –

+0

OK, jest kilka rzeczy, które możesz zrobić, dopasowując zmienne w motywie **() **: * Zmień kolor w elemencie element_rect (color = "black" ...) dla obu elementów ** panel.border ** i * * strip.background ** * Zwiększ odstępy, zwiększając ** panel.margin = jednostka (.05, "linie") ** Aby rozwiązać problem grubych linii obejmujących punkty, możesz zmienić x & y granice działek – yake84

0

Spróbuj tego - możesz nim sterować za pomocą strip.background, sformatowanego za pomocą połączenia element_rect.

qplot (Highway, cty dane = mpg) + facet_grid (. ~ Producenta) +
motyw (strip.text.x = element_text (rozmiar = 8, barwa = "Red", k = 90 ), strip.background = element_rect (wypełnić = "granatowy", kolor = nA))

+0

To ładnie kolory teł prostokąt, gdzie pojawiają się etykiety aspekt, ale nie zmieniać luki między kategoriami - białe linie, które biegną wzdłuż działki oddzielającej grupy aspektów. –

2

może trzeba użyć ggplot „s tabeli układu i gtable funkcje.

library(ggplot2) 
library(gtable) 
library(grid) 

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + 
    facet_grid(am ~ cyl) 
## Get the plot grob 
gt <- ggplotGrob(p) 

## Check the layout 
gtable_show_layout(gt) # Vertical gaps are in columns 5 and 7 
         # and span rows 4 to 9 
         # Horizontal gap is in row 8 
         # and spans columns 4 to 9 


## To automate the selection of the relevant rows and columns: 
## Find the panels in the layout 
## (t, l, b, r refer to top, left, bottom, right); 
## The gaps' indices are one to the right of the panels' r index (except the right most panel); 
## and one below the panels' b index (except the bottom most panel); 
## Rmin and Rmax give the span of the horizontal gap; 
## Bmin and Bmax give the span of the vertical gap; 
## cols and rows are the columns and row indices of the gaps. 

panels = subset(gt$layout, grepl("panel", gt$layout$name), t:r) 

# The span of the horizontal gap 
Rmin = min(panels$r) 
Rmax = max(panels$r) + 1 

#The span of the vertical gap 
Bmin = min(panels$t) - 1 
Bmax = max(panels$t) 

# The columns and rows of the gaps 
cols = unique(panels$r)[-length(unique(panels$r))] + 1 
rows = unique(panels$t)[-length(unique(panels$t))] + 1 

# The grob - orange rectangle 
g = rectGrob(gp = gpar(col = NA, fill = "orange")) 

## Add orange rectangles into the vertical and horizontal gaps 
gt <- gtable_add_grob(gt, 
     rep(list(g), length(cols)), 
     t=Bmin, l=cols, b=Bmax) 

gt <- gtable_add_grob(gt, 
     rep(list(g), length(rows)), 
     t=rows, l=Rmin, r=Rmax) 

## Draw it 
grid.newpage() 
grid.draw(gt) 

enter image description here

+0

To jest naprawdę doskonałe. Zastanawiam się, czy to podejście pozwoli na modyfikację obiektu 'ggplot', który spowoduje powstanie innego obiektu' ggplot', który może mieć warstwy 'ggplot' dodane w późniejszym kroku. Na niepowiązanej notatce miałem problem z dodaniem przypisów w obiektach 'ggplot' i utrzymywaniu w nich klasy' ggplot'. Próbowałem wszystkich metod wymienionych w innym miejscu na stackoverflow. Czy 'gtable' może być alternatywnym podejściem? –

+1

Myślę, że odpowiedź na twoje pytania brzmi "tak". 'gtable' pozwala na pewne modyfikacje początkowych ggplotów. Na przykład, można dodać wiersze i kolumny do układu ggplot, a następnie wstawić do nich groby. @ baptiste zebrał kilka notatek na [https://github.com/baptiste/gtable/wiki/Description](https://github.com/baptiste/gtable/wiki/Description) –

+0

Ogólnie będę miał działki z różną liczbą rzędów/kolumn aspektu. Czy myślisz o wrażliwym na dane sposobie określenia 'Rmin' i' Bmin'? –

Powiązane problemy