Таким образом, простым вариантом будет перекодировать IP
s, которые равны 20 с NA
s, и установить na.value
в этой шкале:
data <- read.table(text = your_posted_data, header = T)
IPcol <- c("green", "greenyellow", "#fed976","#feb24c", "#fd8d3c",
"#fc4e2a", "#e31a1c", "#bd0026", "#800026", "black")
ggplot(data, aes(Patient, IP, fill= ifelse(IP != 20, IP, NA))) +
geom_col() +
scale_fill_gradientn(colours = IPcol, na.value = "white")+
coord_flip()+
scale_y_time()
Если вам нужен сложный вариант, вам нужно написать функцию палитры, которая работает со значениями в диапазоне 0-1 и установить для измененного размера 20 белый:
# Define an area to set to white
target <- (c(19.5, 20.5) - min(data$IP)) / (max(data$IP) - min(data$IP))
# Build a palette function
my_palette <- function(colours, values = NULL) {
ramp <- scales::colour_ramp(colours)
force(values)
function(x) {
# Decide what values to replace
replace <- x > target[1] & x < target[2]
if (length(x) == 0)
return(character())
if (!is.null(values)) {
xs <- seq(0, 1, length.out = length(values))
f <- stats::approxfun(values, xs)
x <- f(x)
}
out <- ramp(x)
# Actually replace values
out[replace] <- "white"
out
}
}
Итеперь вы можете построить его так:
ggplot(data, aes(Patient, IP, fill= IP)) +
geom_col() +
continuous_scale("fill", "my_pal", my_palette(IPcol),
guide = guide_colourbar(nbin = 100))+
coord_flip()+
scale_y_time()