2015-09-02 4 views
1

Я пытаюсь построить карту нагрева с помощью пакета d3heatmap. К сожалению, я еще не успел реализовать определенные перерывы, используя опцию breaks=..., как в heatmap или heatmap.2. Это дает просто смешные результаты, я даже не уверен, что я делаю что-то неправильно или функция просто игнорирует breaks.R - d3heatmap - break break

Например, я попробовал:

breaks = c(seq(-10, -2), seq(-2, -1.65), seq(-1.65, 1.65), seq(1.65, 2), seq(2, 10) 

и

breaks = c(-10, -2, -1.65, 1.65, 2, 10) 

с

colors = c("red", "yellow", "green", "yellow", "red") 

но ничего не кажется, работает правильно.

Любые предложения?

Вот dput мои данные:

> dput(mat) 
structure(c(-0.04, NA, 0.59, NA, 0.675, 0.96, 1.09, 0.445, NA, 
0.545, NA, NA, 0.09, -1.11, NA, 0.99, 0.13, 0.215, 1.425, 0, 
NA, 0.69, 0.805, NA, 0.69, 1.22, NA, 0.3, NA, 0.025, NA, 0.075, 
0.36, -0.94, NA, -0.31, 0.26, 1.02, -1.19, NA, NA, -0.77, NA, 
-1.48, 1.05, 0.48, NA, NA, NA, 1.49, -1.285, NA, 0.76, 1.14, 
-0.62, NA, NA, NA, 0.95, NA, NA, -0.12, 0.49, NA, 2.31, NA, -0.33, 
0.85, NA, -1.7, -1.63, NA, -1.12, 0.135, -0.18, NA, -0.245, NA, 
-0.2, -0.2, 0.23, -0.11, NA, 0.3, -0.81, 0.04, 0.18, -0.7, 0.53, 
0.44, -0.49, 0.28, 0.26, 0.06, 0.265, 0.21, 0.06, -0.175, 0.365, 
0.255, 1.25, -0.35, 0.16, 0.125, 0.825, 0.08, 0.02, -0.02, 0.99, 
0.79, -0.23, 0.06, NA, 0.36, -0.64, -0.195, 1.19, -0.29, 0.915, 
NA, NA, NA, NA, 0.2, 0.1, NA, 0.04, 0.33, NA, 1.46, 2.36, NA, 
-0.92, 1.295, NA, NA, 0.8, NA, 1.09, 1.45, 5.42, NA, NA, NA, 
1.69, 3.43, NA, 0.55), .Dim = c(37L, 4L), .Dimnames = list(c("AT", 
"BE", "BG", "CEE", "CH", "CN", "CZ", "DE", "DK", "EA", "EE", 
"EMU", "ES", "EU", "FI", "FR", "GB", "GR", "HR", "HU", "IE", 
"IT", "JP", "LU", "NL", "PL", "PT", "RO", "RS", "RU", "SE", "SI", 
"SK", "TR", "UA", "UK", "US"), c("Credit Risk", "Funding and liquidity Risk", 
"Macro Risk", "Market Risk"))) 

И код, который я бегу:

d3heatmap(abs(mat), 
      dendrogram = "none", 
      breaks = c(0,1.65,2,10), 
      col = c("green", "yellow", "red"), 
      na.rm = TRUE) 

Та же функция, с помощью heatmap.2 работает отлично, хотя.

+0

могли бы вы предоставить как минимум, воспроизводимый пример? –

+0

Только что предоставлено 'dput' – Christoph

+0

Почему вы используете' abs (mat) ', если ваши разрывы указаны и для отрицательных значений? Я не думаю, что это необходимо, учитывая тот факт, что ваши перерывы симметричны, нет? – erasmortg

ответ

4

Функция d3heatmap просто не имеет аргумента «breaks». Если он передается в качестве аргумента, он молча игнорируется. (См.? D3heatmap.)

Функция Heatmap.2 в пакете gplots, с другой стороны У есть аргумент «breaks». Это объясняет разницу в поведении.

К счастью, все же можно получить желаемое поведение, передав соответствующую функцию «цветов» в d3heatmap. Он работает следующим образом.

Первый пример данных:

mat <- structure(c(-0.04, NA, 0.59, NA, 0.675, 0.96, 1.09, 0.445, NA, 
        0.545, NA, NA, 0.09, -1.11, NA, 0.99, 0.13, 0.215, 1.425, 0, 
        NA, 0.69, 0.805, NA, 0.69, 1.22, NA, 0.3, NA, 0.025, NA, 0.075, 
        0.36, -0.94, NA, -0.31, 0.26, 1.02, -1.19, NA, NA, -0.77, NA, 
        -1.48, 1.05, 0.48, NA, NA, NA, 1.49, -1.285, NA, 0.76, 1.14, 
        -0.62, NA, NA, NA, 0.95, NA, NA, -0.12, 0.49, NA, 2.31, NA, -0.33, 
        0.85, NA, -1.7, -1.63, NA, -1.12, 0.135, -0.18, NA, -0.245, NA, 
        -0.2, -0.2, 0.23, -0.11, NA, 0.3, -0.81, 0.04, 0.18, -0.7, 0.53, 
        0.44, -0.49, 0.28, 0.26, 0.06, 0.265, 0.21, 0.06, -0.175, 0.365, 
        0.255, 1.25, -0.35, 0.16, 0.125, 0.825, 0.08, 0.02, -0.02, 0.99, 
        0.79, -0.23, 0.06, NA, 0.36, -0.64, -0.195, 1.19, -0.29, 0.915, 
        NA, NA, NA, NA, 0.2, 0.1, NA, 0.04, 0.33, NA, 1.46, 2.36, NA, 
        -0.92, 1.295, NA, NA, 0.8, NA, 1.09, 1.45, 5.42, NA, NA, NA, 
        1.69, 3.43, NA, 0.55), .Dim = c(37L, 4L), 
        .Dimnames = list(c("AT", "BE", "BG", "CEE", "CH", "CN", "CZ", "DE", "DK", "EA", "EE", "EMU", "ES", "EU", "FI", "FR", "GB", "GR", "HR", "HU", "IE", "IT", "JP", "LU", "NL", "PL", "PT", "RO", "RS", "RU", "SE", "SI", "SK", "TR", "UA", "UK", "US"), c("Credit Risk", "Funding and liquidity Risk", "Macro Risk", "Market Risk"))) 

Предположим, что мы хотим, чтобы следующие три цвета бункера: синий для значений < 0, зеленый для значений> = 0, но < 2, и красный для значений> = 2. Мы затем определите соответствующий упорядоченный список цветов.

palette <- c("blue", "green", "red") 

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

mi <- min(mat, na.rm = TRUE) 
ma <- max(mat, na.rm = TRUE) 
breaks <- c(mi, 0, 2, ma) 

Теперь мы можем определить функцию интерполяции цвета, которая отображает значение в [0,1] на цвет, уважая наши цветные контейнеры. Пакет «весы» приходит на помощь здесь.

install.package('scales') # if needed 
library(scales) 
colorFunc <- col_bin(palette, bins = rescale(breaks)) 

Перерывы, первоначально определенные в области наших данных, необходимо было перемасштабировать до [0,1]. Функция «масштабирования» в пакете «весы» обрабатывала это.

Небольшая деталь: низкая граница бункера является включен в бункере, но высокая граница исключена. Таким образом, значение 0 будет зеленым, что-либо между 0 и 2 также будет зеленым, но 2 будет красным.

Теперь мы можем построить карту тепла.

d3heatmap(mat, dendrogram = "none", colors = colorFunc, na.rm = TRUE) 

Результат выглядит следующим образом:

enter image description here

+0

Точно то, что я пытался сделать. Благодаря! – Christoph

+0

Хорошо, теперь я столкнулся с следующей проблемой: что, если мин или макс моих данных больше или меньше порога (например, мой минимум равен 0,5, но порог равен 0)? Любое решение @WhiteViking? – Christoph