Объединить непрерывную и дискретную цветовую шкалу в ggplot2?

Я новичок ggplot2. Я делаю график рассеяния, где точки окрашены на основе третьей непрерывной переменной. Однако для некоторых точек эта непрерывная переменная имеет либо значение Inf, либо NaN. Как я могу создать непрерывный масштаб, который имеет специальный, отдельный цвет для Inf и другой отдельный цвет для NaN?

Один из способов получить это поведение - подмножество данных и создание отдельного слоя для особых точек, где задан цвет. Но я хотел бы, чтобы специальные цвета вошли в легенду, и подумайте, что было бы проще устранить необходимость подмножества данных.

Спасибо! Uri

Ответ 1

Я уверен, что это можно сделать более эффективным, но здесь один подход. По существу, мы следуем вашим советам подмножества данных в разные части, разделяем непрерывные данные на дискретные бункеры, затем патируем все обратно и используем масштаб по собственному выбору.

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