2013-06-18 92 views
33

我有一個數據集,我必須製作數十個圖。該數據由30個組和幾組內的多個測量值組成。手動設置ggplot2的組顏色

大多數地塊不會一次使用所有羣組。

我的目標是爲一組組設置一個單色調色板,以便任何給定的組在所有圖形中都具有相同的顏色。 在下面的示例中,這意味着Group CPlot 1Plot 2中的顏色相同。

我的問題是如何去做這件事。

我已經嘗試了scale_fill_manual(和scal_color_manual,適當時)的幾個變體。雖然顏色是從指定的托盤中選擇的,但我似乎無法通過組索引托盤或以某種其他方式「跳過」相應於缺少組的顏色

我還想過嘗試添加顏色信息作爲正在繪製的數據列,但我不確定如何使用此列作爲組的顏色。

Plot Example

# SAMPLE DATA: 
DT1 <- data.table(Name=c("C_sub1", "A_sub1", "A_sub2"), Value=c(2,5,3), Group=c("C", "A", "A"), key="Group") 
DT2 <- data.table(Name=c("A_sub1", "B_sub1", "C_sub1", "C_sub2"), Value=c(4,3,6,3), Group=c("A", "B", "C", "C"), key="Group") 

# SAMPLE Color Pallette 
ColorsDT <- data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group") 

# Add a column for Color, according to the Group 
DT1[ColorsDT, Color := i.Color] 
DT2[ColorsDT, Color := i.Color] 

# A Basic Plot 
simplePlot <- function(DT, tit) 
    ggplot(DT ,aes(x=Name, y=Value, fill=Group)) + 
    geom_bar(stat="identity") + xlab("") + ggtitle(tit) 
    # Tried sevearl variations of: 
    # + scale_fill_manual(values=ColorsDT$Color) 


# Plot Them 
grid.arrange(ncol=2, simplePlot(DT1, tit="Plot 1"), simplePlot(DT2, tit="Plot 2")) 

回答

38

你可以用一種顏色每個組相關聯,然後傳遞給函數:

group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", E = "#E3DB71") 

simplePlot <- function(DT, tit) 
    ggplot(DT ,aes(x=Name, y=Value, fill=Group)) + 
    geom_bar(stat="identity") + xlab("") + ggtitle(tit) + 
    #Specify colours 
    scale_fill_manual(values=group.colors) 

然後使用您的地塊:

grid.arrange(ncol=2, simplePlot(DT1, tit="Plot 1"), 
    simplePlot(DT2, tit="Plot 2")) 

enter image description here

我認爲你的做法的問題是顏色沒有命名,所以scale_fill_manual()不能將它們與它們相關聯。比較:

ColorsDT <- data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group") 
ColorsDT 
# Group Color 
#1:  A #333BFF 
#2:  B #CC6600 
#3:  C#9633FF 
#4:  D #E2FF33 
#5:  E #E3DB71 

有:

ColorsDT.name <- data.table(A = "#333BFF", B = "#CC6600", C = "#9633FF", D = "#E2FF33", E = "#E3DB71") 
ColorsDT.name 
#   A  B  C  D  E 
# 1: #333BFF #CC6600 #9633FF #E2FF33 #E3DB71