Scala e legenda dei colors coerenti tra i grafici quando non tutti i livelli di una variabile di raggruppamento sono presenti nei dati

Ho dati che vengono aggiunti sequenzialmente a un data.frame in R. Sto creando grafici ogni tanto mostrando i risultati. La trama è codificata per colore in base a determinati criteri, alcuni dei quali non vengono mai soddisfatti, quindi non c’è questo colore sul diagramma.

Per esempio,

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

In questo esempio, ho impostato la variabile pink come punti che sono solo maggiori di 50 (che chiaramente non è ansible nei miei dati). Quindi, quando la trama viene creata, manca il nome della legenda ” Pink “, ma il colore rosa è stato assegnato all’etichetta viola. Vorrei che i colors e le etichette rimanessero sempre uguali, anche se esiste una variabile che non viene utilizzata.

Imposta i livelli dei fattori dei Colours per includere tutti i possibili valori, presenti o non presenti nei dati disponibili, quindi aggiungi 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"))