如何在我的热图上分配 9 列特定颜色的独立渐变?

Posted

技术标签:

【中文标题】如何在我的热图上分配 9 列特定颜色的独立渐变?【英文标题】:How do I assign 9 columns specific colours of independent gradient on my heatmap? 【发布时间】:2019-10-08 03:41:19 【问题描述】:

我有一个包含以下 sn-p 的文件,除了 3000 个不同动物和血型的条目

文件A

Animal Bloodtype Count
Horse  Opos      10
Horse  Apos      5
Horse  Bpos      4
Horse  ABpos     5
Horse  Oneg      6
Horse  Aneg      7
Horse  Bneg      9
Horse  ABneg     10
Horse  Unknown   10
Cat    Opos      12
Cat    Apos      15
Cat    Bpos      14
Cat    ABpos     15
Cat    Oneg      16
Cat    Aneg      17
Cat    Bneg      19
Cat    ABneg     14
Cat    Unknown   14
Dog    Opos      9
Dog    Apos      23
Dog    Bpos      12
Dog    ABpos     42
Dog    Oneg      45
Dog    Aneg      23
Dog    Bneg      45
Dog    ABneg     32
Dog    Unknown   32
Mouse  Opos      3
Mouse  Apos      4
Mouse  Bpos      5
Mouse  ABpos     3
Mouse  Oneg      6
Mouse  Aneg      8
Mouse  Bneg      8
Mouse  ABneg     20
Mouse  Unknown   20
Pig    Opos      19
Pig    Apos      13
Pig    Bpos      22
Pig    ABpos     32
Pig    Oneg      25
Pig    Aneg      13
Pig    Bneg      35
Pig    ABneg     22
Pig    Unknown   22

我正在尝试生成一个热图,其中我的 y 轴是动物,x 轴是血型,计数是值。

我正在尝试用自己的特定颜色和每列的递增梯度按血型独立着色每一列,以便轻松判断哪些动物具有大量 O 阳性,或 A 阳性等,以及通过递减梯度降低的动物数量。等等(因为血型是用颜色编码的,便于观察)

基本上,我已经尝试做类似这个 *** 问题中所做的事情:ggplot2 heatmaps: using different gradients for categories

或者这个但每行不同的颜色: Heat map per column with ggplot2

csv_file<-read.csv("~/Documents/FileA.csv")

csv_file.s <- ddply(csv_file, .(Bloodtype), transform, rescale = scale(Count))

csv_file.s$Category <- csv_file.s$Bloodtype

levels(csv_file.s$Category) <- 
  list("Opos" = c("Opos"),
       "Apos" = c("Apos"),
       "Bpos" = c("Bpos"),
       "ABpos" = c("ABpos"),
       "Oneg" = c("Oneg"),
       "Aneg" = c("Aneg"),
       "Bneg" = c("Bneg"),
       "Oneg" = c("Oneg"),
       "Unknown" = c("Unknown"))

csv_file.s$rescaleoffset <- csv_file.s$rescale + 100*(as.numeric(as.factor(csv_file.s$Category))-1)
scalerange <- range(csv_file.s$rescale)
gradientends <- scalerange + rep(c(0,100,200), each=8)
colorends <- c("white", "Aquamarine4", "white", "yellow4", "white", "turquoise4","white","orange4", "white", "slategray4","white","seagreen4","white","purple4","white","red4","white","blue4")


ggplot(csv_file.s, aes(Bloodtype, Animal)) + 
  geom_tile(aes(fill = rescaleoffset), colour = "transparent") + 
  scale_fill_gradientn(colours = colorends, 
                       values = rescale(gradientends)) + 
  scale_x_discrete("", expand = c(0, 0))+ 
  scale_y_discrete("", expand = c(0, 0)) +
  theme(panel.background = element_rect(fill = 'white'))
  theme_grey(base_size = 12) + 
  theme(legend.position = "none",
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 330, hjust = 0))

但是渐变结果是错误的,颜色到处都是。我一直在尝试找到如何为热图中的特定列标题分配颜色,即 Unknown="blue4", ABneg="red4",但无济于事。基本上,我不知道我在做什么。 :(

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

所以我能想到的最简单的解决方案是简单地将血型映射到填充颜色并将计数映射到 alpha 比例,这样高计数具有高颜色强度,低计数接近白色。我不确定你所说的升序和降序是什么意思,所以我基本上忽略了这一点。

假设dfdata.frame 格式的数据的sn-p:

ggplot(df, aes(x = Bloodtype, y = Animal, fill = Bloodtype, alpha = Count)) +
  # Dummy tile geom for white background
  geom_tile(fill = "white", alpha = 1) +
  geom_tile() +
  scale_alpha_continuous(breaks = seq(0, max(df$Count), length.out = 10), 
                         limits = c(0, NA))

您可能需要稍微调整一下 alpha 刻度中的中断和限制,以匹配您的数据。当然,您可以通过在绘图中添加scale_fill_*() 来选择任何您想要的填充颜色。

【讨论】:

感谢 teunbrand!我做了 scale_fill_manual 来分配颜色,它奏效了!你知道我怎么能只隐藏“Count”图例吗? 是的,您可以将 guide = "none" 添加到 scale_alpha_continuous() 参数中。很高兴它成功了! 谢谢!再问一个问题,您是否碰巧知道如何使所有颜色变暗。我的意思是我有一个介于 1 到 300 之间的数字范围,因此,1 的计数几乎不可见 - 但我仍然想将它们与 300 的计数区分开来。 您可以尝试在scale_alpha_continuous() 中使用limits = c(..., ...),以获得从某个数字开始的限制(例如,c(-5, NA) 使计数 = 1 的颜色更丰富一些)。另一种选择是使用例如log10()sqrt()asinh() 转换您的计数,以突出显示 1 和 5 之间的差异比 41 和 45 之间的差异更重要。 哦,这就是限制。伟大的想法。我会给他们一个机会。非常感谢@teunbrand!

以上是关于如何在我的热图上分配 9 列特定颜色的独立渐变?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在自定义标题栏上设置背景颜色渐变?

在 UITableViewCell 的背景图像上添加渐变

css字体渐变,css怎样定义让字体有渐变颜色

【R画图】环形热图

如何将数组绘制为热图时间序列

R热图:将颜色分配给值