2013-09-28 14 views
13

Jak przypiąć ten sam kolor do wartości na różnych poletkach?ggplot2: Jak używać tych samych kolorów na różnych polach dla tego samego współczynnika

Say mam dwie data.frames DF1 i df2:

library(ggplot2) 
library(gridExtra) 

set.seed(1) 
df1 <- data.frame(c=c('a', 'b', 'c', 'd', 'e'), x=1:5, y=runif(5)) 
df2 <- data.frame(c=c('a', 'c', 'e', 'g', 'h'), x=1:5, y=runif(5)) 

Podczas kreślenia ich użyciu C jako kolorowym wskaźnikiem uzyskać ten sam pięć kolorów.

g1 <- ggplot(df1, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity") 
g2 <- ggplot(df2, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity") 
grid.arrange(g1, g2, ncol=2) 

enter image description here

Chcę jednak, że te same wartości c uzyskać ten sam kolor.

Odpowiedz

8

teraz napisałem funkcję, która generuje inną funkcję, która oblicza kolory. Nie jestem pewien, czy to dobry sposób. Komentarze docenione.

library(ggplot2) 
library(gridExtra) 
library(RColorBrewer) 

makeColors <- function(){ 
    maxColors <- 10 
    usedColors <- c() 
    possibleColors <- colorRampPalette(brewer.pal(9 , "Set1"))(maxColors) 

    function(values){ 
    newKeys <- setdiff(values, names(usedColors)) 
    newColors <- possibleColors[1:length(newKeys)] 
    usedColors.new <- c(usedColors, newColors) 
    names(usedColors.new) <- c(names(usedColors), newKeys) 
    usedColors <<- usedColors.new 

    possibleColors <<- possibleColors[length(newKeys)+1:maxColors] 
    usedColors 
    } 
} 

mkColor <- makeColors() 


set.seed(1) 
df1 <- data.frame(c=c('a', 'b', 'c', 'd', 'e'), x=1:5, y=runif(5)) 
df2 <- data.frame(c=c('a', 'c', 'e', 'g', 'h'), x=1:5, y=runif(5)) 

g1 <- ggplot(df1, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity") + scale_fill_manual(values = mkColor(df1$c)) 
g2 <- ggplot(df2, aes(x=x, y=y, fill=c)) + geom_bar(stat="identity") + scale_fill_manual(values = mkColor(df2$c)) 
grid.arrange(g1, g2, ncol=2) 

enter image description here

7

Aby dokonać tego rodzaju kompozytowych działek, ggplot2 ma aspekty:

df1$id = 'A' 
df2$id = 'B' 
df_all = rbind(df1, df2) 
ggplot(df_all, aes(x=x, y=y, fill=c)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~id) 

enter image description here

Przy stosowaniu aspektów, ggplot2 traktuje zarówno działek jako całość, utrzymując wartość koloru Mapping the same.

+2

Tylko w moim przykładzie mogę umieścić dwie działki razem. Mój prawdziwy problem składa się z wielu niezależnych wątków. – JerryWho

11

Możesz ustawić własną skalę wypełnienia za pomocą scale_fill_manual. Tworzę wektor nazwany z kolorami i różnymi wartościami "c".

dd <- union(df1$c,df2$c) 
dd.col <- rainbow(length(dd)) 
names(dd.col) <- dd 

Następnie:

g1 <- ggplot(df1, aes(x=x, y=y, fill=c)) + 
    geom_bar(stat="identity") + 
    scale_fill_manual("Legend", values = dd.col) 
g2 <- ggplot(df2, aes(x=x, y=y, fill=c)) + 
    geom_bar(stat="identity") + 
    scale_fill_manual("Legend", values = dd.col) 
grid.arrange(g1, g2, ncol=2) 

enter image description here

+0

Więc muszę wiedzieć, ile różnych kolorów będę używał. Czy istnieje sposób na "zbieranie" kolorów podczas kreślenia każdego wykresu po drugim? Mój rzeczywisty problem składa się z wielu niezależnych wątków i nie wiem na początku ile (i jakie) wartości dla "c" dostanę. – JerryWho

Powiązane problemy