Объединить непрерывную и дискретную цветовую шкалу в 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)