2016-01-22 28 views
9

I dati sono stati aggiunti in sequenza a uno 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.Scala e legenda dei colori coerenti tra i grafici quando non tutti i livelli di una variabile di raggruppamento sono presenti nei dati

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 il colore rosa variabile da punti che sono solo maggiori di 50 (che non è chiaramente possibile nei miei dati). Pertanto, quando viene creato il grafico, manca il nome della legenda "Pink", ma il colore rosa è stato assegnato all'etichetta viola. Vorrei che i colori e le etichette rimanessero sempre uguali, anche se esiste una variabile che non viene utilizzata.

risposta

9

Impostare i livelli di fattore di Colours per includere tutti i possibili valori, sia presente o meno nei dati a portata di mano, quindi aggiungere drop=FALSE-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")) 
+0

Questo è perfetto! Grazie :) – sym246