2011-08-28 14 views
10

Sono un principiante ggplot2. Sto facendo un grafico a dispersione in cui i punti sono colorati in base a una terza variabile continua. Tuttavia, per alcuni punti, quella variabile continua ha un valore Inf o un NaN. Come posso generare una scala continua che ha un colore speciale, separato per Inf e un altro colore separato per NaN?Combina scala colori continua e discreta in ggplot2?

Un modo per ottenere questo comportamento consiste nel sottoporre a serie i dati e creare un livello separato per i punti speciali, in cui è impostato il colore. Ma mi piacerebbe che anche i colori speciali entrassero nella legenda, e penso che sarebbe più pulito eliminare la necessità di sottoporre a serie i dati.

Grazie! Uri

risposta

12

Sono sicuro che questo può essere reso più efficiente, ma ecco un approccio. In sostanza, seguiamo il tuo consiglio di inserire i dati nelle diverse parti, suddividere i dati continui in contenitori separati, quindi ricollegare tutto e utilizzare una scala di nostra scelta.

library(ggplot2) 
library(RColorBrewer) 

#Sample data 
dat <- data.frame(x = rnorm(100), y = rnorm(100), z = rnorm(100)) 
dat[sample(nrow(dat), 5), 3] <- NA 
dat[sample(nrow(dat), 5), 3] <- Inf 

#Subset out the real values 
dat.good <- dat[!(is.na(dat$z)) & is.finite(dat$z) ,] 
#Create 6 breaks for them 
dat.good$col <- cut(dat.good$z, 6) 

#Grab the bad ones 
dat.bad <- dat[is.na(dat$z) | is.infinite(dat$z) ,] 
dat.bad$col <- as.character(dat.bad$z) 

#Rbind them back together 
dat.plot <- rbind(dat.good, dat.bad) 

#Make your own scale with RColorBrewer 
yourScale <- c(brewer.pal(6, "Blues"), "red","green") 

ggplot(dat.plot, aes(x,y, colour = col)) + 
    geom_point() + 
    scale_colour_manual("Intensity", values = yourScale) 

enter image description here

+0

Perché 'dat $ col [is.finite (dat $ z)] <- cut (dat $ z [is.finite (dat $ z)], 6)' non riescono a lavoro? Invece di ottenere le etichette di intervallo, ottengo solo numeri interi ... –

+0

@Uri - Mi sono imbattuto nello stesso problema e quindi ho intrapreso il percorso di separazione dei valori "buoni" dal male, quindi li leghiamo di nuovo insieme alla fine. Immagino che sia perché quando provi a farlo subito, i fattori vengono convertiti al loro equivalente numerico ... anche se, ammetto, non ho passato molto tempo a cercare di forzarlo a funzionare come la soluzione che ho trovato funzionava . – Chase

Problemi correlati