【问题标题】:How can I create a specific color gradient scale for my heatmap?如何为我的热图创建特定的颜色渐变比例?
【发布时间】:2019-10-07 09:33:49
【问题描述】:

我想为我的热图创建这个色阶:

  1. [0-49] -> 深绿色

  2. [50-99] -> 绿色

  3. [100-149] -> 浅绿色

  4. [150-199] -> 黄色

  5. [200-299] -> 橙色

  6. [300-…] -> 红色

这是我的数据集示例:

我已经尝试过下面的代码,但它不起作用:

colfunc <-colorRampPalette(c("darkgreen", "lightgreen", "yellow", "orange", "red"))
ggplot(DATASET, aes(x = BUS_NR, y = MONTH_NR, fill = factor(ALERT_NB)) +
  geom_tile() +
  scale_fill_manual(values = colfunc(300))

【问题讨论】:

  • 如果没有reproducible example,很难很好地回答这个问题——数据样本可以让您清楚地知道您正在使用什么
  • 嗨,Camille,我已经用数据集更新了我的帖子! :)
  • 点击我评论中的链接。有一些方法可以包含我们可以加载到 R 中的数据样本,即不是表格图片
  • 对不起@camille!我是堆栈溢出的新手!我还在学习它是如何工作的!我可以使用 cut() 进行练习,昨天我还发现了 scale_fill_gradientn() 函数,我真的很喜欢它!非常感谢您的时间和帮助!祝你有美好的一天!

标签: r ggplot2 scale colorbrewer


【解决方案1】:

关键是定义一个函数,它在数据集中创建一个新列,定义颜色的类别(在我的例子中是 z)。然后你可以简单地将颜色映射到类并绘制它。下次请提供示例数据集。花了很多时间才弄清楚,但现在可以了:

library(ggplot2)
x <- 1:10
y <- x*x*x
df <- data.frame(x,y)
cols <- c("1"="darkgreen","2"="green", "3"="lightgreen", "4" = "yellow", "5"="orange", "6"="red")

classof <- function(a){
  if (a<50){
    return(1)
  }
  if (a<100){
    return(2)
  }
  if (a<150){
    return(3)
  }
  if (a<200){
    return(4)
  }
  if (a<300){
    return(5)
  }
  else {
    return(6)
  }
}
z <- c()
for (i in seq(1,length(y))){
  z <- c(z,classof(y[i]))
}

df$z <- z

p <- ggplot(df, aes(x,y))+ geom_point(aes(colour = factor(z)))
p + scale_colour_manual(values=cols)

【讨论】:

  • 我会尝试将此应用到我的热图!
  • 您不需要定义一个函数来执行此操作:cut 是一个基本函数,它将采用一个中断向量。还要记住,由于 R 是一种矢量化语言,您不需要 for 循环来沿矢量应用函数,并且通过以这种方式绑定每次迭代来构建矢量变得昂贵
  • 我已经试过了,效果很好!再次感谢您的帮助@benschbob91!
  • 嗨@camille,请问如何用 cut() 替换函数“classof”?谢谢!
  • 在你的情况下应该是:cut(y, breaks=c(50,100,150,200,300))
猜你喜欢
  • 2017-10-01
  • 2019-12-04
  • 2019-10-08
  • 2019-05-14
  • 2021-02-24
  • 2013-11-28
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多