【问题标题】:Need a palette with 64 colours: simple heatmap question需要 64 种颜色的调色板:简单的热图问题
【发布时间】:2020-12-20 18:54:03
【问题描述】:

我有几千个矩阵,如下所示:

         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
 [1,] 560.5681 526.3265 501.4808 447.4124 475.3496 487.1298
 [2,] 556.7537 525.3711 460.2989 412.7424 478.1070 506.8339
 [3,] 570.1362 534.5701 461.2309 476.0936 509.1480 491.3332
 [4,] 564.1036 538.4911 593.1357 573.0606 532.7869 496.5737
 [5,] 606.3170 583.7723 536.8325 614.4326 514.1198 427.6375
 [6,] 555.8331 576.4716 642.0229 617.1337 620.3885 483.4476
 [7,] 790.4830 790.4830 790.4830 790.4830 790.4830 790.4830
 [8,] 790.4830 790.4830 790.4830 790.4830 790.4830 790.4830
 [9,] 790.4830 790.4830 790.4830 790.4830 790.4830 790.4830
[10,] 790.4830 790.4830 790.4830 790.4830 790.4830 790.4830

我想构建一个足够灵敏的热图,为每个单元格提供自己的阴影。我尝试了以下方法:

heatmap(irradiances_shaded_ready_to_use_FINAL[[160]][[1200]], Colv=NA, 
        Rowv=NA, xlab="", ylab="Irradiance", 
        main="Snapshot 1200 day 160", 
        col=colorRampPalette(brewer.pal(64, "Oranges"))(3))

...但是错误/警告消息是:

Warning message:
In brewer.pal(64, "Oranges") :
  n too large, allowed maximum for palette Oranges is 9
Returning the palette you asked for with that many colors

请注意:在我上面粘贴的上述矩阵中,有几个重复的值,但一般情况并非如此。我有 500,000 个这样的矩阵,我想对其中的一小部分样本进行热图,但总的来说,我希望在大多数情况下会有 64 个唯一值。

所以基本上:我需要一个调色板来说明一个由 64 个唯一值组成的矩阵。如果这是一个如此简单的问题,我很抱歉。

@jay.sf 建议我使用“heat.colors(等)”,但这对我不起作用。请参阅下面的热图:前四行没有阴影,而它们应该是。

【问题讨论】:

  • col=heat.colors(64) 有什么问题?
  • 一个好主意,但不幸的是它无法为我想要的所有单元格着色。我将发布一张图片作为对原始问题的修改。
  • 当您查看矩阵时,在热图未着色的相应行中,根本没有变化,即没有“热量”,也许这可能是您的问题。当您执行col="red" 时,该区域甚至会保持白色。
  • 也许我在这里选择了错误的示例,但就像我说的那样,大约有 50 万个这样的矩阵,即使每个单元格不同的矩阵示例,我也会遇到这个问题。你可以说调色板不够灵敏。
  • 知道了! heatmap 默认为 scale="row" 您可能想要 "none",请参阅下面的答案。

标签: r colors heatmap


【解决方案1】:

您可以使用基本colorRampPalette 函数扩展RColorBrewer 调色板:

library(RColorBrewer)
colorRampPalette(brewer.pal(8, "Oranges"))(64)

我还建议使用pheatmap::pheatmap。您提供一个数字矩阵 + 一个 100 种颜色的向量,剩下的一切由它代劳。

library(pheatmap)
data <- matrix(rnorm(100), ncol = 10)
pheatmap(mat = data, color = colorRampPalette(brewer.pal(8, "Oranges"))(100))

【讨论】:

  • 这个我试过了,恐怕不行。
  • 加载了什么RColorBrewer?当你尝试时发生了什么?
  • 见上图。这是同一件事。如果我使用 brewer.pal(8, "Oranges)(64),我会得到同样的结果:前四行没有阴影,我真的希望它们都被阴影。
  • 我记得过去在使用 heatmapcol 时遇到过麻烦。我建议尝试pheatmap::pheatmap,而是提供一个矩阵 + 一个 100 种颜色的向量,剩下的事情就交给你了。查看我的更新答案
  • 你说得对,这行得通。当我只是想模仿它时,不知道为什么/如何它不起作用。非常感谢。
【解决方案2】:

默认情况下heatmap 使用scale="row",也可以使用"column""none"。我认为后者是您所需要的,因为没有变化的行被缩放为零,因此看起来没有阴影。当您执行col=heat.colors(64) 时,“有问题的”行的颜色非常浅。诀窍是在 64 种颜色中添加一些多余的颜色和子集。

heatmap(m, Colv=NA, Rowv=NA,
        xlab="", ylab="Irradiance", 
        main="Snapshot 1200 day 160", 
        col=heat.colors(64+6)[1:64], scale="none")


m <- structure(c(560.5681, 556.7537, 570.1362, 564.1036, 606.317, 
555.8331, 790.483, 790.483, 790.483, 790.483, 526.3265, 525.3711, 
534.5701, 538.4911, 583.7723, 576.4716, 790.483, 790.483, 790.483, 
790.483, 501.4808, 460.2989, 461.2309, 593.1357, 536.8325, 642.0229, 
790.483, 790.483, 790.483, 790.483, 447.4124, 412.7424, 476.0936, 
573.0606, 614.4326, 617.1337, 790.483, 790.483, 790.483, 790.483, 
475.3496, 478.107, 509.148, 532.7869, 514.1198, 620.3885, 790.483, 
790.483, 790.483, 790.483, 487.1298, 506.8339, 491.3332, 496.5737, 
427.6375, 483.4476, 790.483, 790.483, 790.483, 790.483), .Dim = c(10L, 
6L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2018-11-08
    • 2020-12-16
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多