2011-08-28 8 views
10

Jestem nowicjuszem ggplot2. Robię wykres punktowy, w którym punkty są kolorowane w oparciu o trzecią zmienną ciągłą. Jednak w przypadku niektórych punktów ta zmienna ciągła ma wartość Inf lub NaN. Jak mogę wygenerować ciągłą skalę, która ma specjalny, oddzielny kolor dla Inf i inny oddzielny kolor dla NaN?Łączenie ciągłej i dyskretnej skali kolorów w ggplot2?

Jednym ze sposobów uzyskania tego zachowania jest podzielenie danych i utworzenie osobnej warstwy dla specjalnych punktów, w których ustawiony jest kolor. Ale chciałbym, aby specjalne kolory również weszły do ​​legendy i myślę, że byłoby czystsze, aby wyeliminować potrzebę podzbioru danych.

Dzięki! Uri

Odpowiedz

12

Jestem pewien, że można to uczynić bardziej wydajnym, ale oto jedno podejście. Zasadniczo postępujemy zgodnie z twoją radą polegającą na dzieleniu danych na różne części, dzieleniu danych ciągłych na oddzielne pojemniki, a następnie łączeniu wszystkich razem i stosowaniu skali według własnego wyboru.

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

Dlaczego 'DAT $ col [is.finite (DAT $ z)] <- cut (DAT $ z [is.finite (DAT $ z)], 6)' nie praca? Zamiast otrzymywania etykiet interwałowych, po prostu otrzymuję liczby całkowite ... –

+0

@Uri - Wpadłem na ten sam problem, a następnie przeszedłem ścieżką oddzielania "dobrych" wartości od złych, a następnie wiążę je ponownie na końcu. Zgaduję, że dlatego, że gdy próbujesz to zrobić od razu, czynniki są konwertowane na ich numeryczne odpowiedniki ... choć nie spędziły wiele czasu próbując zmusić go do pracy, ponieważ rozwiązanie, które wymyśliłem, działało . – Chase