Escala de color consistente y leyenda entre plots cuando no todos los niveles de una variable de agrupación están presentes en los datos

Tengo datos que se agregan secuencialmente a un data.frame en R. Estoy creando diagtwigs de vez en cuando mostrando los resultados. La ttwig está codificada por colores de acuerdo con ciertos criterios, algunos de los cuales nunca se cumplen, por lo tanto, no hay este color en el diagtwig.

Por ejemplo,

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

En este ejemplo, he configurado la variable rosa para que sean puntos que son solo mayores que 50 (lo que claramente no es posible en mis datos). Entonces, cuando se crea la ttwig, falta el nombre de la leyenda ‘ Pink ‘, pero el color rosa se ha asignado a la etiqueta violeta. Me gustaría que los colores y las tags permanezcan iguales todo el tiempo, incluso si hay una variable que no se usa.

Establezca los niveles de factores de los Colours para incluir todos los valores posibles, estén presentes o no en los datos disponibles, luego agregue 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"))