2013-09-28 177 views
13

Làm cách nào để ghim cùng một màu vào một giá trị trong các ô khác nhau?ggplot2: Cách sử dụng các màu giống nhau trong các ô khác nhau cho cùng một hệ số

Nói rằng tôi có hai data.frames df1 và 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)) 

Khi âm mưu chúng bằng c như màu chỉ thị tôi nhận được cùng một năm màu.

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

Nhưng tôi muốn điều đó cùng một giá trị của c có cùng một màu sắc.

Trả lời

8

bây giờ tôi đã viết một chức năng mà tạo ra một chức năng mà tính toán màu sắc. Tôi không chắc đó có phải là cách hay hay không. Bình luận đánh giá cao.

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

Để làm loại lô composite, ggplot2 có khía cạnh:

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

Khi sử dụng khía cạnh, ggplot2 xử lý cả lô như một toàn thể, giữ cho màu sắc có giá trị lập bản đồ giống nhau.

+2

Chỉ trong ví dụ của tôi, tôi đưa hai lô với nhau. Vấn đề thực sự của tôi bao gồm nhiều lô độc lập. – JerryWho

11

Bạn có thể đặt tỷ lệ lấp đầy của riêng mình bằng cách sử dụng scale_fill_manual. Tôi tạo một vector có tên với màu sắc và các giá trị khác nhau của "c".

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

Sau đó:

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

Vì vậy, tôi phải biết có bao nhiêu màu sắc khác nhau tôi sẽ sử dụng. Có cách nào để "thu thập" các màu sắc trong quá trình vẽ đồ thị sau mỗi âm mưu không? Vấn đề thực tế của tôi bao gồm nhiều âm mưu độc lập và tôi không biết lúc đầu có bao nhiêu (và loại) giá trị cho "c" tôi sẽ nhận được. – JerryWho