gpt4 book ai didi

r - 如何在 heatmap.2() 中为原始数据分配色阶

转载 作者:行者123 更新时间:2023-12-04 00:50:19 25 4
gpt4 key购买 nike

我有看起来像这样的数据:

                         Name    h1    h2    h3    h4    h5
1 1420468_at_Asb17 0.000 2.328 0.000 0.000 0.000
2 1430261_at_1700024J04Rik 1.236 2.050 0.000 0.000 0.000
3 1431788_at_Fabp12 0.000 2.150 0.000 0.000 0.587
4 1433187_at_B230112I24Rik 0.000 2.240 1.343 0.000 1.383
5 1434430_s_at_Adora2b 0.000 2.006 1.459 0.000 1.272
6 1435217_at_Gm7969 0.727 2.350 1.494 0.976 0.000
7 1436717_x_at_Hbb-y 0.000 2.712 0.000 0.000 0.000
8 1440859_at_Akap6 0.000 2.053 0.000 0.000 1.840
9 1442625_at_--- 0.000 2.064 1.173 0.000 1.035
10 1443715_at_Rbm24 0.969 2.219 0.000 0.000 0.000
11 1445520_at_--- 0.000 2.497 0.000 0.000 0.000
12 1446035_at_Gm7173 0.000 3.869 0.000 0.000 0.000
13 1446597_at_6820445E23Rik 1.000 2.000 0.000 0.000 0.000
14 1448925_at_Twist2 0.000 2.089 0.938 0.000 0.000
15 1449711_at_Atp6v1e1 0.605 2.363 2.350 1.094 0.976
16 1455931_at_Chrna3 0.000 2.354 0.000 0.000 0.000
17 1457647_x_at_1600023N17Rik 0.000 2.734 0.000 0.000 1.812
18 1458975_at_--- 0.000 2.079 0.000 0.000 0.000
19 1459862_at_--- 0.727 2.606 0.000 0.000 1.151

请注意,在此数据(和实际数据)中没有负值和正值
可以大到 100 左右。

我想要做的是使用我自己指定的色标和方案绘制热图:
  • 当值为 0 时,将其设置为白色。
  • 当值为 == 1 时,将其设置为黑色。
  • 当值 > 1 时,将其设置为红色阴影。
  • 当值 < 1 且 > 0 时,将其设置为绿色阴影。

  • 也不使用任何数据缩放或内置 z-score 转换。
    我怎样才能做到这一点?

    我目前的代码是这样的:
    library(gplots)

    # Read data
    dat <- read.table("http://dpaste.com/1501148/plain/",sep="\t",header=T);
    rownames(dat) <- dat$Name
    dat <- dat[,!names(dat) %in% c("Name")]

    # Clustering and distance measure functions
    hclustfunc <- function(x) hclust(x, method="complete")
    distfunc <- function(x) dist(x,method="maximum")

    # Define colours
    hmcols <- rev(redgreen(2750));

    # Plot
    pdf("~/Desktop/tmp.pdf",height=10)
    heatmap.2(as.matrix(dat),Colv=FALSE,dendrogram="row",scale="row",col=hmcols,trace="none", margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0),keysize=1);
    dev.off()

    这会生成以下图,其中使用默认的 z 分数行缩放。

    enter image description here

    最佳答案

    这里的关键是理解 heatmap.2使用 col参数结合 breaks论据。

    看看下面的代码和图,看看我的意思。

    library(gplots)
    set.seed(100)
    dat = matrix( rexp(25,1/2), ncol=5 )
    breaks = 0:5
    col = c("green","blue","red","yellow","brown")
    heatmap.2( dat, breaks=breaks, col=col )

    enter image description here

    如你所见,肯定有 n-1 n 的颜色休息。对于您的特定问题,问题是将正确的颜色映射到中断处。我正在使用 scale="none" @josilber 指出的选项。
    breaks = seq(0,max(dat),length.out=1000)
    gradient1 = colorpanel( sum( breaks[-1]<=1 ), "white", "green", "black" )
    gradient2 = colorpanel( sum( breaks[-1]>1 ), "black", "red" )
    hm.colors = c(gradient1,gradient2)

    heatmap.2(as.matrix(dat),scale="none",breaks=breaks,col=hm.colors,
    Colv=FALSE,dendrogram="row",trace="none",
    margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0))

    enter image description here

    另一种选择是有两个渐变:绿色->黑色和黑色->红色。然后,您可以通过使它们 NA 手动将零值设置为白色。和设置 na.color="white" .
    breaks = seq(0,max(dat),length.out=1000)
    gradient1 = colorpanel( sum( breaks[-1]<=1 ), "green", "black" )
    gradient2 = colorpanel( sum( breaks[-1]>1 ), "black", "red" )
    hm.colors = c(gradient1,gradient2)

    dat[dat==0] = NA
    heatmap.2(as.matrix(dat),scale="none",breaks=breaks,col=hm.colors,na.color="white",
    Colv=FALSE,dendrogram="row",trace="none",
    margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0))

    最后,您可以手动编辑零值的渐变。
    breaks = seq(0,max(dat),length.out=1000)
    gradient1 = colorpanel( sum( breaks[-1]<=1 ), "green", "black" )
    gradient2 = colorpanel( sum( breaks[-1]>1 ), "black", "red" )
    hm.colors = c(gradient1,gradient2)
    hm.colors[1] = col2hex("white")

    heatmap.2(as.matrix(dat),scale="none",breaks=breaks,col=hm.colors,na.color="white",
    Colv=FALSE,dendrogram="row",trace="none",
    margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0))

    enter image description here

    日志折叠更改

    另一方面,您可能正在查看折叠变化或某种类型的比率。在制作热图时绘制对数折叠变化是很常见的。我“变灰”了零值。
    dat[dat==0] = NA
    heatmap.2( as.matrix(log2(dat)), col=greenred(100),
    scale="none", na.color="grey",symbreaks=TRUE,
    Colv=FALSE,dendrogram="row",trace="none",
    margin=c(5,10), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0))

    enter image description here

    有关@josilber 的好解决方案的解释:

    此代码 hmcols <- c(colfunc1(200), colfunc2(200*(max(dat) - 1)))使
    长度为 774 的字符向量(见 length(hmcols))。因此,这意味着应该定义 775 个中断。 heatmap.2函数默认使 n+1中断在哪里 ncol 中使用的向量的长度论据。所以断点数和颜色数都算出来了,但是 hmcols <- c(colfunc1(200), colfunc2(200*(max(dat) - 1)))怎么算出来的?将颜色正确映射到中断点?诀窍在于 hmcols向量已创建。第一个渐变中的颜色数为 200。自 breaks没有明确定义,我们知道中断将均匀分布。由于第一个渐变从 0 到 1,并且有 200 个中断,因此每个中断的宽度应为 0.005(或 1/200)。由于第二个梯度从 1 到 3.869 ( max(dat) ),因此应该有 2.869/0.005=573.8 间断(向上舍入时为 574 间断)。请注意 200*(max(dat) - 1))做这个计算;它输出 573.8。因此,然后有 200+574 种颜色映射到正确的中断,一切正常!

    关于r - 如何在 heatmap.2() 中为原始数据分配色阶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20535635/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com