如何在我的热图上分配 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 比例,这样高计数具有高颜色强度,低计数接近白色。我不确定你所说的升序和降序是什么意思,所以我基本上忽略了这一点。
假设df
是data.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 列特定颜色的独立渐变?的主要内容,如果未能解决你的问题,请参考以下文章