2013-06-18 13 views
33

Mam zestaw danych, z którego muszę wykonać kilkadziesiąt działek. Dane składają się z 30 grup i kilku pomiarów w każdej grupie.Ręczne ustawianie kolorów grup dla ggplot2

Większość działek nie będzie używać wszystkich grup naraz.

Moim celem jest posiadanie jednej palety kolorów dla zestawu grup, tak aby dana grupa była tego samego koloru na wszystkich wykresach. W poniższym przykładzie oznaczałoby to, że Group C jest tego samego koloru w Plot 1 i Plot 2.

Moje pytanie brzmi: jak to zrobić.

Próbowałem kilka odmian scale_fill_manual (i scal_color_manual, jeśli jest to właściwe). Podczas gdy kolory są wybierane z wyznaczonej palety, nie mogę indeksować palety przez grupę lub w jakiś inny sposób "pomijać" kolory odpowiadające brakującej grupie

Pomyślałem także, aby spróbować dodać informacje o kolorze jako kolumna danych, które są drukowane, ale nie jestem pewien, jak użyć tej kolumny jako koloru dla grupy.

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")) 

Odpowiedz

38

Można skojarzyć każdej grupy z kolorem, a następnie przekazać do funkcji:

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) 

Następnie używając swojego działek:

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

enter image description here

Myślę, że problem z twoim podejściem polegał na tym, że kolory nie zostały nazwane, więc scale_fill_manual() nie może ich odrzucić. Porównaj:

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 

z:

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 
Powiązane problemy