2017-07-07 6 views
1

Ich habe Probleme, Farben zu gruppieren und sie in der Legende darzustellen. Die Funktion nimmt eine Ebene auf, die nicht innerhalb der Daten liegt (3.), und zeigt sie in der Legende an, aber nicht mit 4..Ändern von Farben von geom_bar

x <- structure(list(date = structure(c(1498521600, 1498525200, 1498528800, 
1498532400, 1498536000, 1498539600, 1498543200, 1498546800, 1498550400, 
1498554000, 1498557600, 1498561200, 1498564800, 1498568400, 1498572000, 
1498575600, 1498579200, 1498582800), class = c("POSIXct", "POSIXt" 
), tzone = "UTC"), irish_rules_sensitive = c(0, 0, 0, 0, 0, 1, 
2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("date", "irish_rules_sensitive" 
), row.names = c(NA, -18L), class = c("tbl_df", "tbl", "data.frame" 
)) 
color_var_sens <- vector(mode = "double",length = length(x$irish_rules_sensitive)) 
color_var_sens[color_var_sens== '0']<- NA 
color_var_sens[x$irish_rules_sensitive>=1 & x$irish_rules_sensitive<=3] <- "#FFFF00" 
color_var_sens[x$irish_rules_sensitive>=3 & x$irish_rules_sensitive<6] <- "#FFAA00" 
color_var_sens[x$irish_rules_sensitive>=6 & x$irish_rules_sensitive<9] <- "#FF5500" 
color_var_sens[x$irish_rules_sensitive>=12] <- "#FF0000" 


p5 <- ggplot(x)+ 
    geom_col(aes(x = date, y = irish_rules_sensitive, color = color_var_sens, group = 1), size= 1)+ 
    scale_y_continuous(limits = c(0, 40))+ 
    labs(x="", y="Accum. EBHours")+ 
    scale_color_identity("Modified Irish Rules", breaks= rev(levels(as.factor(color_var_sens)))[c(1,2,3,4)], 
         labels = c("Low ","Medium", "High", "Very High"), 
         guide = "legend",drop = FALSE) 
p5 + guides(colour=guide_legend(override.aes=list(fill=c("#FFFF00","#FFAA00","#FF5500", "#FF0000"))), size = "none") 

Das Seltsame ist, dass dies manchmal funktioniert und das Ergebnis sollte wie folgt sein:

Fehlercode:

Error in `[[<-.data.frame`(`*tmp*`, v, value = c("#FFFF00", "#FFAA00", : 
    replacement has 4 rows, data has 3 

Antwort

2

Das Problem tritt auf, weil color_var_sens kein Faktor ist und die guide_legend Versuche ersetzen Werte, die nicht in color_car_sens existieren. Du solltest es zu einem Faktor machen. Auf diese Weise benötigen Sie nicht die guide_legend:

color_var_sens <- factor(level=rev(c("#FFFF00","#FFAA00","#FF5500", "#FF0000")), ordered=T) 
color_var_sens[color_var_sens== '0']<- NA 
color_var_sens[x$irish_rules_sensitive>=1 & x$irish_rules_sensitive<=3] <- "#FFFF00" 
color_var_sens[x$irish_rules_sensitive>=3 & x$irish_rules_sensitive<6] <- "#FFAA00" 
color_var_sens[x$irish_rules_sensitive>=6 & x$irish_rules_sensitive<9] <- "#FF5500" 
color_var_sens[x$irish_rules_sensitive>=12] <- "#FF0000" 


ggplot(x,aes(x = date, y = irish_rules_sensitive, fill = color_var_sens))+ 
    geom_col(size= 1)+ 
    scale_y_continuous(limits = c(0, 40)) + 
    labs(x="", y="Accum. EBHours") + 
    scale_fill_identity("Modified Irish Rules", breaks= rev(levels(as.factor(color_var_sens))), 
         labels = c("Low ","Medium", "High", "Very High"), 
         guide = "legend",drop = FALSE)