Присвойте определенный цвет определенному значению на гистограмме, используя scale_fill_gradientn - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть огромный набор данных, содержащий поминутные записи некоторых параметров у 20 пациентов. Визуализируя записи мониторинга пациента (параметр IP), я пытался построить цветные столбики. Поэтому я использовал функцию scale_fill_gradient() в r.

Проблема в том, что я хотел бы присвоить определенному значению (например, IP = 20) специальный цвет (скажем, белый). Можно ли сделать это с помощью scale_fill_gradient?

моя база данных выглядит так:

Patient min IP
1a      75  19
1a      76  21 
1a      77  20
1a      78  18.5
1a      79  17
1a      80  25
1a      81  29.3
1a      82  32.1
1a      83  30.9
2c      1   2
2c      2   5
2c      3   8 
2c      4   9
2c      5   12
2c      6   16   
2c      7   18
3v      72  38 
3v      73  35
3v      74  30.3
3v      75  28.7
3v      76  27
3v      77  25.2
3v      78  22
3v      79  19.1
3v      80  18 
3v      81  15

мой код

i<- ggplot(data, aes(patient, IP, fill=IP))
IPcol <- c("green", "greenyellow", "#fed976","#feb24c", "#fd8d3c", "#fc4e2a", "#e31a1c", "#bd0026", "#800026", "black")
i+geom_bar(stat = "identity")+ scale_fill_gradientn(colours = IPcol)+ coord_flip()+scale_y_time()

Из этого кода я получаю следующее изображение:

Так что единственное, что я хочу изменить - это то, что IP = 20 должен быть белым

1 Ответ

2 голосов
/ 04 ноября 2019

Таким образом, простым вариантом будет перекодировать 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()

enter image description here

Если вам нужен сложный вариант, вам нужно написать функцию палитры, которая работает со значениями в диапазоне 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()

enter image description here

...