Escala de colors consistente e legenda entre charts quando nem todos os níveis de uma variável de agrupamento estão presentes nos dados

Eu tenho dados que estão sendo adicionados sequencialmente a um data.frame em R. Eu estou criando charts de vez em quando mostrando os resultados. O enredo é codificado por colors de acordo com determinados critérios, alguns dos quais nunca são cumpridos, portanto, não há essa cor no diagrama.

Por exemplo,

 library(ggplot2) dates15=seq(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-06-30 23:45:00"), by="15 min") ex.data=rnorm(length(dates15),2,1) blue=c(1:5000) pink=which(ex.data>50) purple=c(10000:15000) colours=rep("Black points", length(dates15)) colours[blue]="Blue Points" colours[pink]="Pink points" colours[purple]="Purple points" all.data=data.frame(Date=dates15, Data=ex.data, Colours=colours) g.cols=c("black", "blue", "pink", "purple") ggplot(all.data, aes(Date, Data, colour=Colours, group=1))+geom_line()+scale_color_manual(values=g.cols)+ xlim(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-02-12 23:45:00")) 

Neste exemplo, defini a variável rosa como pontos que são apenas maiores que 50 (o que claramente não é possível em meus dados). Portanto, quando o gráfico é criado, o nome da legenda ” Pink ” está ausente, mas a cor rosa foi atribuída ao label roxo. Eu gostaria que as colors e os labels permanecessem correspondidos o tempo todo, mesmo que houvesse uma variável que não fosse usada.

Defina os níveis de fator de Colours para include todos os valores possíveis, presentes ou não nos dados disponíveis, e adicione drop=FALSE a scale_colour_manual :

 all.data=data.frame(Date=dates15, Data=ex.data, Colours=colours) g.cols=c("black", "blue", "pink", "purple") all.data$Colours = factor(all.data$Colours, levels=sort(c(unique(colours), "Pink Points"))) ggplot(all.data, aes(Date, Data, colour=Colours, group=1)) + geom_line() + scale_color_manual(values=g.cols, drop=FALSE) + xlim(as.POSIXct("2015-01-01 00:00:00"), as.POSIXct("2015-02-12 23:45:00"))