2013-05-06 12 views
8

Chciałbym utworzyć działkę z marginesami w ggplot2. Chciałbym jednak, aby wykres marży miał kolory zgodnie z tym, od którego aspektu pochodzi konkretny punkt. To chyba najlepiej ilustruje na przykładzie:Kolorowanie punktów według współczynnika na marginesie fasetowanego wykresu ggplot2 w R

library(ggplot2) 

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p + facet_grid(.~gear, margins = TRUE) 

obrębie działki margines oznaczonego jako „(wszystkie)”, chcę te kropki, które mają „bieg = 3”, aby być wykreślone z jednego koloru, te z „biegu = 4 "z drugim kolorem, a te z" biegiem = 5 "z trzecim.

Ten nie wykonać zadanie:

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(aes(col=gear)) 
p + facet_grid(.~gear, margins = TRUE) 

Czy istnieje sposób, aby osiągnąć to, co chcę?

Odpowiedz

3

Co powiesz na utworzenie nowej zmiennej jako odniesienia i pokolorowanie punktów? Wydaje się pracować pod warunkiem, że nie masz nic przeciwko tym, że punkty w pierwszych 3 fasetach też są kolorowe.

mtcars$ref <- as.factor(mtcars$gear) 

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(aes(col=as.factor(gear))) 
p + facet_grid(.~ref, margins = TRUE) 

All points coloured by gear

EDIT: udało mi się dostać to, aby usunąć klucz kolorów z pierwszych 3 aspektach, ale nie bez zabawy z oryginalnych danych;

Powiel oryginalne dane (tak, aby były 2 z każdego rekordu), a następnie zamiast używać wykresu marginesów, aby utworzyć aspekt "wszystkich", zamiast tego użyj rekordów nadmiarowych.

library(ggplot2) 

mtcars$ref <- (mtcars$gear) 

# create the duplicate 
dat <- do.call("rbind", replicate(2, mtcars, simplify = FALSE)) 

# give the duplicates a false value for "gear" so they can be plotted together 
#This value can then be used for faceting, grouping everything with "all". 

dat$ref[1:32] <- "all" 


# where not in the "all" facet, change "gear" to one (so they are plotted with the same colour) 
dat$gear[dat$ref != "all"] <- 1 

# then plot using ref as the facet and gear to colour points. 

p <- ggplot(dat, aes(mpg, wt)) + geom_point(aes(col=as.factor(gear))) 
p + facet_grid(.~ref, margins = F) 

Points only coloured by gear in final facet

nie jestem pewien, że to najlepszy sposób, aby przejść o tym, ale może ktoś z większym doświadczeniem może być w stanie doradzić?

+0

Ok, dzięki, że to naprawdę dobry i prosty pomysł! Jedyną wadą jest to, że w tym przypadku nie widzę sposobu na usunięcie kolorów z wykresów bez marginesów. Czy naprawdę masz pojęcia, dlaczego 'col (gear)' (lub 'col = (as.factor (gear))) nie działa, ale' col = ref' ma? – AnjaM

+1

Czy edycja jest lepsza? Nie jest to najbardziej eleganckie rozwiązanie, ale mam nadzieję, że pomoże. Myślę, że ma to związek z definiowaniem koloru i faceting z tą samą zmienną, ggplot nadaje każdemu aspektowi swój własny kolor. –

+1

@AnjaM możesz spróbować dodać 'scale_color_manual (values ​​= c (" black "," red "," green "," blue "))'. 'col = (as.factor (gear))' nie zadziała, ale 'col = as.factor (gear)' powinno być – Carson

1

Innym rozwiązaniem byłoby stworzenie obliczach działek i marży działkę osobno i korzystania z biblioteki gridExtra je łączyć:

library(ggplot2) 
library(gridExtra) 
mtcars$ALL <- "all" 
p <- ggplot(mtcars, aes(mpg, wt)) 
p1 <- p + geom_point() + facet_grid(.~gear) 
p2 <- p + geom_point(aes(color=factor(gear))) + facet_grid(.~ALL) 
grid.arrange(p1, p2, ncol=2) 

enter image description here

+0

Dzięki, to także dobry pomysł! Nie wiedziałem, że tak łatwo jest zaaranżować działki "ggplot2"! – AnjaM

Powiązane problemy