2013-09-28 3 views
13

Wie kann ich die gleiche Farbe an einen Wert in verschiedenen Plots anheften?ggplot2: Wie man dieselben Farben in verschiedenen Plots für denselben Faktor verwendet

Sagen, ich habe zwei data.frames DF1 und 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)) 

Wenn sie c als Farbindikator mit Plotten ich die gleichen fünf Farben.

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

Aber ich möchte, dass gleiche Werte von c die gleiche Farbe erhalten.

Antwort

8

Ich schrieb nun eine Funktion, die eine andere Funktion erzeugt, die die Farben berechnet. Ich bin mir nicht sicher, ob es ein guter Weg ist. Kommentare geschätzt.

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

Um diese Art von Verbund Plots zu machen, ggplot2 Facetten hat:

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

Wenn Facetten verwenden, ggplot2 behandelt beiden Plots als Ganze, die Abbildung den gleicht den Farbwert zu halten.

+2

Gerade in meinem Beispiel habe ich die beiden zusammen Parzellen. Mein wirkliches Problem besteht aus vielen unabhängigen Plots. – JerryWho

11

Sie können Ihre eigene Füllskala mit scale_fill_manual einstellen. Ich erstelle einen benannten Vektor mit Farben und verschiedenen Werten von "c".

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

Dann:

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

Also ich muss wissen, wie viele verschiedene Farben ich verwenden werde. Gibt es eine Möglichkeit, die Farben beim Plotten der einzelnen Plots nach dem anderen zu "sammeln"? Mein eigentliches Problem besteht aus vielen unabhängigen Plots und ich weiß zu Beginn nicht, wie viele (und welche Art von) Werte ich für "c" bekommen werde. – JerryWho

Verwandte Themen