R:使用 ggplot 更改风险热图中的 colorPalette 颜色

R: Change colorPalette colors in risk heatmap using ggplot

感谢您查看我的问题。我创建了一个带有颜色渐变的热图。颜色渐变看起来不错,但是,我希望颜色更明确。我在这里附上的第一张图片

是我 运行 我的代码时得到的。第二张图

是我想要得到的。我不确定如何解决这个问题。下面是我的一小部分代码示例。明确地说,我希望我的代码 return 第二张图片颜色明显从绿色、金色、橙色、浅红色、红色和深红色变化。

library(RColorBrewer)
library(dplyr)
library(ggplot2)

nRow <- 5 
nCol <- 5 
m3 <- matrix(c(2,2,3,3,3,1,2,2,3,3,1,1,2,2,3,1,1,2,2,2,1,1,1,1,2), nrow = 5, ncol = 5, byrow = TRUE)
myData <- m3 #matrix(rnorm(nRow * nCol), ncol = nCol)
rownames(myData) <- c("5", "4", "3", "2","1")  
colnames(myData) <- c("1", "2", "3", "4","5")  
longData <- reshape2::melt(myData)
colnames(longData) <- c("Likelihood", "Consequence", "value")
longData <- mutate(longData, value = Consequence * Likelihood)

cols <-function(n) {
  colorRampPalette(rev(c("red4","red2","tomato2","orange","gold1","forestgreen")))(6)                                
}

display_risk <-  mutate(longData, value = Consequence * Likelihood)

ggplot(longData,aes(x = Consequence, y = Likelihood, fill = value))  +
  geom_tile() +
  scale_fill_gradientn(colours = cols(6)) +
  theme(axis.text.y = element_text(angle=90, hjust=1), legend.position = "none") +
  scale_x_continuous(name = "Probability", breaks = seq(1,5,1), expand = c(0, 0)) +
  scale_y_reverse(name= "Severity", breaks = seq(1,5,1), expand = c(0, 0)) +
  geom_hline(yintercept = seq(1.5,5.5)) +
  geom_vline(xintercept = seq(1.5,5.5)) +
  coord_fixed()

这里有一些指向我试过但没有成功的答案的链接。

除了将您想要的颜色映射到特定的值范围外,我几乎想不出什么不同的方法。见下文。请检查我是如何减少你的代码的,有很多不必要的调用,(我猜你已经从你尝试过不同东西的脚本中复制了它)。此外,我更改了 colorRampPalette 调用 - 这是一个函数生成器,无需在此处使用 function()

请注意,您需要手动定义值,我猜这将是您的研究人员决定如何呈现数据。您需要将其缩放到范围 0:1

library(RColorBrewer)
library(dplyr)
library(ggplot2)

myData <- matrix(c(2,2,3,3,3,1,2,2,3,3,1,1,2,2,3,1,1,2,2,2,1,1,1,1,2), nrow = 5, ncol = 5, byrow = TRUE)
longData <- reshape2::melt(myData)
colnames(longData) <- c("Likelihood", "Consequence", "value")
longData <- mutate(longData, value = Consequence * Likelihood)
mycols <- rev(c("red4","red2","tomato2","orange","gold1","forestgreen"))
cols <- colorRampPalette(mycols)

myvals <- c(0, 8, 9, 10, 11, 25)
scaled_val <- scales::rescale(myvals, 0:1)

ggplot(longData, aes(x = Consequence, y = Likelihood, fill = value)) +
  geom_tile() +
  scale_fill_gradientn(colours = cols(length(mycols)), 
                       values = scaled_val) +
  theme(axis.text.y = element_text(angle = 90, hjust = 1), legend.position = "none") +
  scale_x_continuous(name = "Probability", breaks = seq(1, 5, 1), expand = c(0, 0)) +
  scale_y_reverse(name = "Severity", breaks = seq(1, 5, 1), expand = c(0, 0)) +
  geom_hline(yintercept = seq(1.5, 5.5)) +
  geom_vline(xintercept = seq(1.5, 5.5)) +
  coord_fixed()

此外,您还可以定义渐变的起始位置。我已经展示了 。请注意,您想要的输出与这些值不匹配(我将它们叠加在一起以证明这一点)。还要注意这一切显然都是由你自己定义的——我选择的那些值是随机的,你可以根据自己的喜好调整它。


myvals <- c(0, 6, 7, 9, 10, 11, 25)
scaled_val <- scales::rescale(myvals, 0:1)

ggplot(longData, aes(x = Consequence, y = Likelihood, fill = value)) +
  geom_tile() +
  geom_text(aes(label = value)) +
  scale_fill_gradientn(colours = c(mycols[1], mycols), 
                       values = scaled_val) +
  theme(axis.text.y = element_text(angle = 90, hjust = 1), legend.position = "none") +
  scale_x_continuous(name = "Probability", breaks = seq(1, 5, 1), expand = c(0, 0)) +
  scale_y_reverse(name = "Severity", breaks = seq(1, 5, 1), expand = c(0, 0)) +
  geom_hline(yintercept = seq(1.5, 5.5)) +
  geom_vline(xintercept = seq(1.5, 5.5)) +
  coord_fixed()