Вопрос по r, ggplot2, heatmap – Тепловая карта ggplot2 с цветами для ранжированных значений

25

Я хочу сделать тепловую карту в ggplot2. Данные и код моей игрушки:

set.seed(12345)
dat <- 
  data.frame(
      Row = rep(x = LETTERS[1:5], times = 10)
    , Col = rep(x = LETTERS[1:10], each = 5)
    , Y = rnorm(n = 50, mean = 0, sd = 1)
    )
library(ggplot2)
p <- ggplot(data =  dat, aes(x = Row, y = Col)) + 
      geom_tile(aes(fill = Y), colour = "white") +
      scale_fill_gradient(low = "white", high = "steelblue")
p

Я хочу иметь цветовую схему для значений в диапазоне, как это:

-3 <= Y < -2  ---> Dark Blue
-2 <= Y < -1  ---> Blue
-1 <= Y <  0  ---> Light Blue
 0 <= Y <  1  ---> Light Green
 1 <= Y <  2  ---> Green
 2 <= Y <= 3  ---> Dark Green

Любая помощь будет высоко оценена. Спасибо

Ваш Ответ

2   ответа
40

хотите ли вы, чтобы отдельные цвета или перечисленные вами цвета были просто маркерами в диапазонеY, Я покажу оба.

Для дискретных цветов используйтеY1 как определяет это Джоран

dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)

Затем вы можете получить график с конкретными цветами, которые вы перечислите, используя ручную шкалу

p <- ggplot(data =  dat, aes(x = Row, y = Col)) + 
      geom_tile(aes(fill = Y1)) +
      scale_fill_manual(breaks=c("\[-Inf,-3)", "\[-3,-2)", "\[-2,-1)", 
                                 "\[-1,0)", "\[0,1)", "\[1,2)", 
                                 "\[2,3)", "\[3, Inf)"),
                        values = c("white", "darkblue", "blue",
                                   "lightblue", "lightgreen", "green",
                                   "darkgreen", "white"))
p

Я не знал, что вы хотите для цветов, превышающих -3 и 3, поэтому я использовал белый.

Если вам нужен непрерывный цвет, переходящий от синего на отрицательном через белый при 0 к зеленому на положительном,scale_fill_gradient2 должно сработать.

ggplot(data =  dat, aes(x = Row, y = Col)) + 
  geom_tile(aes(fill = Y)) +
  scale_fill_gradient2(low="darkblue", high="darkgreen", guide="colorbar")

enter image description here

Если вам нужен точный контроль цвета, такой, чтобы отображение было "темным синим" на 3 "синий" на 2 "светло-синий"; на 1 "белый" в 0 и т. д., затемscale_fill_gradientn будет работать на вас:

library("scales")
ggplot(data =  dat, aes(x = Row, y = Col)) + 
  geom_tile(aes(fill = Y)) +
  scale_fill_gradientn(colours=c("darkblue", "blue", "lightblue", 
                                 "white",
                                 "lightgreen", "green", "darkgreen"),
                       values=rescale(c(-3, -2, -1,
                                        0,
                                        1, 2, 3)),
                       guide="colorbar")

@Aguscamacho Вы получили какие-либо сообщения об ошибках? Я получил довольно четкое сообщение об ошибке, в котором говорится, что «[» нераспознанный выход в символьной строке Удаление\  в руководствеbreaks определение работает. Видя, что ответу шесть лет, вполне вероятно, что код работал шесть лет назад, но был сломан из-за какого-то обновления R или ggplot2 или чего-то еще.
Интересно, что, несмотря на 40 голосов "за", когда я копирую и вставляю метод Брайана для scale_fill_manual, он просто не будет работать, как показано на рисунке.
Спасибо @Brian за хороший ответ. Вы волшебник ggplot2. Очень признателен за вашу помощь. MYaseen208
19

но вот один из них в качестве отправной точки.

Во-первых, используйтеcut создать фактор изY с соответствующими диапазонами:

dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)

Затем построите график с помощью палитры изRColorBrewer:

ggplot(data =  dat, aes(x = Row, y = Col)) + 
      geom_tile(aes(fill = Y1), colour = "white") +
      scale_fill_brewer(palette = "PRGn")

enter image description here

Эта цветовая схема более фиолетовая, чем синяя на нижнем конце, но она самая близкая, которую я мог найти среди палитры пивоваров.

Если вы хотите создать свой собственный, вы можете просто использоватьscale_fill_manual и укажите желаемый вектор цветов дляvalues аргумент.

Спасибо @joran за ваш ответ. Интересно, как очистить линии между двумя прямоугольниками графиков? Спасибо MYaseen208
@ MYaseen208 Setcolour = "transparent" вgeom_tile.

Похожие вопросы