У меня есть тепловая карта корреляции, созданная в plotly
. Шкала шкалы изменяется от -1 до 1. По мере того, как корреляция становится более сильной, плитки окрашиваются в более темный красный цвет. По мере того, как корреляции становятся сильнее отрицательно, плитки окрашиваются в темно-синий цвет. Мне нужно, чтобы нулевые значения были окрашены в белый цвет. Однако цветовая шкала просто выбирает нулевой цвет в зависимости от распределения набора данных. Как сделать так, чтобы нулевые значения были белыми и находились посередине цветовой полосы? Я пробовал использовать этот ответ, но не могу заставить его работать для этой тепловой карты. Пожалуйста, помогите, я схожу с ума!
library(plotly)
library(magrittr)
# compute a correlation matrix
correlation <- round(cor(mtcars), 3)
nms <- names(mtcars)
colorlength <- 100
null_value <- (0 - min(correlation)) / (max(correlation) - min(correlation))
border <- as.integer(null_value * colorlength)
colorscale <- as.list(1:colorlength)
#colorscale below zero
s <- scales::seq_gradient_pal("blue", "white", "Lab")(seq(0,1,length.out=border))
for (i in 1:border) {
colorscale[[i]] <- c((i - 1) / colorlength, s[i])
}
#colorscale above zero
s <- scales::seq_gradient_pal("white", "red", "Lab")(seq(0,1,length.out=colorlength - border))
for (i in 1:(colorlength - border)) {
colorscale[[i + border]] <- c((i + border) / colorlength, s[i])
}
plot_ly(x = nms, y = nms, z = correlation,
key = correlation, type = "heatmap", source = "heatplot",color = ~correlation,
colorscale = colorscale,
colorbar = list(len=1)) %>%
layout(xaxis = list(title = ""),
yaxis = list(title = ""))
Как насчет использования ggplot
и ggplotly
:
library(tidyverse);
gg <- correlation %>%
as.data.frame() %>%
rownames_to_column("x") %>%
gather(y, val, -x) %>%
ggplot(aes(x, y, fill = val)) +
geom_tile() +
scale_fill_gradientn(
colours = c("blue", "white", "red"),
limits = c(-1, 1))
# Create plotly object
library(plotly);
ggplotly(gg);
Объяснение: В ggplot
мы можем использовать scale_fill_gradientn
для явной установки limits
, гарантируя, что белый цвет соответствует значению 0
. ggplotly
затем преобразует объект ggplot
в объект plotly
.
Это довольно просто с ggplotly
, но я думаю, что вы также можете сделать это с plotly
. Вы можете попробовать это:
col3 <- colorRamp(c("red", "white", "blue"))
plot_ly(x = nms, y = nms, z = correlation,
key = correlation, type = "heatmap", source = "heatplot",color = col3,
colorscale = colorscale,
colorbar = list(len=1, limits = c(-1, 1))) %>%
layout(xaxis = list(title = ""),
yaxis = list(title = ""))
С plotly
, используя объект graph_objects.Heatmap
, поскольку вы знаете пределы значений тепловой карты, вы можете просто установить параметры zmax
, zmid
, zmin
на 1, 0, -1
соответственно, а параметр colorscale
на любую цветовую шкалу с белым посередине, например RdBu
.