Установка средней точки для непрерывно расходящейся цветовой шкалы на тепловой карте - PullRequest
1 голос
/ 05 ноября 2019

Мне нужно отрегулировать расположение средней точки для тепловой карты через ggplot2. Я погуглил и увидел, что scale_fill_gradient2 отлично подходит, но цвета, похоже, не соответствуют тому, что я ищу. Я знаю, что для z требуется диапазон от 0 до 1. Пример генерации набора данных ниже:

library(ggplot2)
library(tibble)
library(RColorBrewer)

set.seed(5)
df <- as_tibble(expand.grid(x = -5:5, y = 0:5, z = NA))
df$z <- runif(length(df$z), min = 0, max = 1)

Я пробовал рисовать с scale_fill_gradient2, но синий цвет не получается таким "темным", как хотелось бы,

ggplot(df, aes(x = x, y = y)) + 
  geom_tile(aes(fill = z)) + 
  scale_fill_gradient2(
    low = 'red', mid = 'white', high = 'blue',
    midpoint = 0.7, guide = 'colourbar', aesthetics = 'fill'
  ) + 
  scale_x_continuous(expand = c(0, 0), breaks = unique(df$x)) + 
  scale_y_continuous(expand = c(0, 0), breaks = unique(df$y))

Version 1

Поэтому я использую scale_fill_distiller с цветовой палитрой 'RdBu', которая поставляется с нужной мне цветовой шкалой, нодиапазоны и средние точки не верны.

ggplot(df, aes(x = x, y = y)) + 
  geom_tile(aes(fill = z)) +
  scale_fill_distiller(palette = 'RdBu') + 
  scale_x_continuous(expand = c(0, 0), breaks = unique(df$x)) +
  scale_y_continuous(expand = c(0, 0), breaks = unique(df$y))

Version 2

Есть ли способ получить 2-ю цветовую шкалу, но с возможностью установить диапазон средней точки в качестве первого?

Ответы [ 2 ]

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

Ответ Клауса великолепен (и я фанат его работы), но я хотел бы добавить, что вы можете сохранить контроль и внутри vanilla ggplot, если вы используете функцию scale_fill_gradientn():

library(ggplot2)
library(tibble)

set.seed(5)
df <- as_tibble(expand.grid(x = -5:5, y = 0:5, z = NA))
df$z <- runif(length(df$z), min = 0, max = 1)

ggplot(df, aes(x = x, y = y)) + 
  geom_tile(aes(fill = z)) + 
  scale_fill_gradientn(
    colours = c("red", "white", "blue"),
    values = c(0, 0.7, 1)
  ) + 
  scale_x_continuous(expand = c(0, 0), breaks = unique(df$x)) + 
  scale_y_continuous(expand = c(0, 0), breaks = unique(df$y))

enter image description here

Заметным недостатком является то, что вам придется указывать аргумент values в измененном пространстве, то есть между 0-1. Подумайте, если ваши значения заполнения находятся в диапазоне от 0 до 10 и вы хотите, чтобы средняя точка была на 0,7, вам нужно будет указать values = c(0, 0.07, 1).

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

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

library(ggplot2)
library(tibble)
library(colorspace)

set.seed(5)
df <- as_tibble(expand.grid(x = -5:5, y = 0:5, z = NA))
df$z <- runif(length(df$z), min = 0, max = 1)

ggplot(df, aes(x = x, y = y)) + 
  geom_tile(aes(fill = z)) + 
  scale_fill_continuous_divergingx(palette = 'RdBu', mid = 0.7) + 
  scale_x_continuous(expand = c(0, 0), breaks = unique(df$x)) + 
  scale_y_continuous(expand = c(0, 0), breaks = unique(df$y))

Однако, как вы видите, это создает ту же проблему, что и раньше, потому что вы 'Я должен быть дальше от средней точки, чтобы получить более темный блюз. К счастью, цветовые шкалы расходящихся х позволяют вам независимо управлять любой ветвью, и поэтому мы можем создать шкалу, которая становится темно-синей гораздо быстрее. Вы можете играть с l3, p3 и p4, пока не получите желаемый результат.

ggplot(df, aes(x = x, y = y)) + 
  geom_tile(aes(fill = z)) + 
  scale_fill_continuous_divergingx(palette = 'RdBu', mid = 0.7, l3 = 0, p3 = .8, p4 = .6) + 
  scale_x_continuous(expand = c(0, 0), breaks = unique(df$x)) + 
  scale_y_continuous(expand = c(0, 0), breaks = unique(df$y))

Создано в 2019-11-05 представьте пакет (v0.3.0)

...