如何在 heatmap.2 中展开树状图

     2023-03-12     146

关键词:

【中文标题】如何在 heatmap.2 中展开树状图【英文标题】:How to expand the dendogram in heatmap.2 【发布时间】:2014-03-25 20:15:34 【问题描述】:

我有以下带有树状图的热图。

完整数据为here。

问题是左边的树状图被压扁了。如何在不改变热图列大小的情况下解压(展开)它?

它是用这段代码生成的:

#!/usr/bin/Rscript
library(gplots);
library(RColorBrewer);


plot_hclust  <- function(inputfile,clust.height,type.order=c(),row.margins=70) 

    # Read data
    dat.bcd <- read.table(inputfile,na.strings=NA, sep="\t",header=TRUE);


    rownames(dat.bcd) <- do.call(paste,c(dat.bcd[c("Probes","Gene.symbol")],sep=" "))
    dat.bcd <- dat.bcd[,!names(dat.bcd) %in% c("Probes","Gene.symbol")] 
    dat.bcd <- dat.bcd

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


    # Select based on FC, as long as any of them >= anylim

    anylim <- 2.0
    dat.bcd <- dat.bcd[ apply(dat.bcd, 1,function(x) any (x >= anylim)), ]


    # Clustering functions
    height <- clust.height; 

    # Define output file name
    heatout <- paste("tmp.pafc.heat.",anylim,".h",height,".pdf",sep="");


    # Compute distance and clusteirn function
    d.bcd <- distfunc(dat.bcd)
    fit.bcd <- hclustfunc(d.bcd)


    # Cluster by height
    #cutree and rect.huclust has to be used in tandem
    clusters <- cutree(fit.bcd, h=height) 
    nofclust.height <-  length(unique(as.vector(clusters)));

    myorder <- colnames(dat.bcd); 
    if (length(type.order)>0) 
     myorder <- type.order
    

    # Define colors
    #hmcols <- rev(brewer.pal(11,"Spectral"));
    hmcols <- rev(redgreen(2750));
    selcol <- colorRampPalette(brewer.pal(12,"Set3"))
    selcol2 <- colorRampPalette(brewer.pal(9,"Set1"))
    sdcol= selcol(5);
    clustcol.height = selcol2(nofclust.height);

    # Plot heatmap
    pdf(file=heatout,width=20,height=50); # for FC.lim >=2
    heatmap.2(as.matrix(dat.bcd[,myorder]),Colv=FALSE,density.info="none",lhei=c(0.1,4),dendrogram="row",scale="row",RowSideColors=clustcol.height[clusters],col=hmcols,trace="none", margin=c(30,row.margins), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0),keysize=0.3);
    dev.off();



#--------------------------------------------------
# ENd of functions 
#-------------------------------------------------- 

plot_hclust("http://pastebin.com/raw.php?i=ZaGkPTGm",clust.height=3,row.margins=70);

【问题讨论】:

你所说的 squiished 到底是什么意思? 大部分的树状图,我们看不清楚树的高度。 这不是因为大多数节点之间的关系比最底层的节点更密切吗?要“解压”树状图中“压扁”的部分,似乎需要进一步扩展已经未被压扁的区域。否则高度不再是相对的。也许您可以缩放高度(例如sqrt),以使较大的值更接近大多数值,但这可能会导致树的误导。或者,使整个情节更宽。 【参考方案1】:

在您的情况下,数据有长尾,这是基因表达数据(对数正态)的预期。

data <- read.table(file='http://pastebin.com/raw.php?i=ZaGkPTGm', 
                   header=TRUE, row.names=1)

mat <- as.matrix(data[,-1]) # -1 removes the first column containing gene symbols

从分位数分布可以看出,表达量最高的基因将范围从1.5扩展到300以上。

quantile(mat)

#     0%     25%     50%     75%    100% 
#  0.000   0.769   1.079   1.544 346.230 

当对未缩放数据执行层次聚类时,生成的树状图可能会显示出对具有最高表达式的值的偏差,如您的示例所示。在许多 (reference) 中,这需要对数或 z 分数转换。您的数据集包含values == 0,这是对数转换的问题,因为log(0) 未定义。

Z-score 转换 (reference) 在heatmap.2 中实现,但需要注意的是,该函数在缩放数据之前计算距离矩阵并运行聚类算法。因此,scale='row' 选项不会影响聚类结果,有关详细信息,请参阅我之前的帖子 (differences in heatmap/clustering defaults in R)。

我建议您运行heatmap.2:之前扩展您的数据:

# scale function transforms columns by default hence the need for transposition.
z <- t(scale(t(mat))) 

quantile(z)

#         0%        25%        50%        75%       100% 
# -2.1843994 -0.6646909 -0.2239677  0.3440102  2.2640027 

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

# obtain the clusters
fit <- hclustfunc(distfunc(z))
clusters <- cutree(fit, 5) 

# require(gplots)
pdf(file='heatmap.pdf', height=50, width=10)
heatmap.2(z, trace='none', dendrogram='row', Colv=F, scale='none', 
             hclust=hclustfunc, distfun=distfunc, col=greenred(256), symbreak=T,
             margins=c(10,20), keysize=0.5, labRow=data$Gene.symbol,
             lwid=c(1,0.05,1), lhei=c(0.03,1), lmat=rbind(c(5,0,4),c(3,1,2)),
             RowSideColors=as.character(clusters))
dev.off()

另外,请参阅附加帖子 here 和 here,其中解释了如何通过 lmatlwidlhei 参数设置热图的布局。

生成的热图如下所示(省略行和列标签):

【讨论】:

谢谢一百万。最后一个问题,z &lt;- t(scale(t(mat))) 这里的 scale 函数和 Z-score 变换是一样的吧? @pdubois,不客气。是的,scale 应用 z 分数转换。请参阅creating z-scores in R 上的这篇文章。注意它在输入矩阵上的用法:row-based 转换t(scale(t(mat))),或column-based 转换scale(mat)。关注the use of z-scores 上的这篇文章,可视化基因表达的变化。【参考方案2】:

据我所知,您的数据集中可能有一些异常值(最底部的对象)。请尝试以下操作:

    从数据集中删除异常值 对数标度您的距离,以减少对极端值的重视

【讨论】:

【参考方案3】:

使用 'scale' 参数使用 'fheatmap' 包可以轻松转换 Zscore。查看“fheatmap”包。树状图的高度可以通过增加画布(pdf)的宽度来扩展。 http://cran.r-project.org/web/packages/fheatmap/index.html

【讨论】:

r语言绘图——层次聚类图及树状图添加sidebar(代码片段)

聚类分析作图往往包含热图(heatmap)和树状图(dendrogram)。热图用来展示每个样本点数值大小和聚集模式。树状图用来表示样本之间以及变量之间的距离远近(或者相似性大小)。R官网目前提供了至少45个可以绘制热图的包(pac... 查看详情

如何在 matplotlib 中调整树状图的分​​支长度(如在 astrodendro 中)? [Python]

】如何在matplotlib中调整树状图的分​​支长度(如在astrodendro中)?[Python]【英文标题】:Howtoadjustbranchlengthsofdendrograminmatplotlib(likeinastrodendro)?[Python]【发布时间】:2018-11-2314:09:35【问题描述】:下面是我的结果图,但我希望它看... 查看详情

您如何比较两个树状图(在 R 中)之间的“相似性”?

】您如何比较两个树状图(在R中)之间的“相似性”?【英文标题】:Howdoyoucomparethe"similarity"betweentwodendrograms(inR)?【发布时间】:2010-02-0721:23:28【问题描述】:我有两个树状图,我希望将它们相互比较,以了解它们有多... 查看详情

在 heatmap.2 函数中更改标题字体大小?

】在heatmap.2函数中更改标题字体大小?【英文标题】:Changetitlefontsizeinheatmap.2function?【发布时间】:2013-12-2620:49:38【问题描述】:我正在使用heatmap.2包制作热图:heatmap.2(as.matrix(FOOBAR.txt[rowSums(abs(FOOBAR.txt))!=0,]),col=scaleyellowred,margin... 查看详情

如何根据定义的组为树状图的标签着色? (在 R 中)

】如何根据定义的组为树状图的标签着色?(在R中)【英文标题】:Howtocoloradendrogram\'slabelsaccordingtodefinedgroups?(inR)【发布时间】:2015-09-1601:03:58【问题描述】:我在R中有一个24行10,000列的数字矩阵。这个矩阵的行名基本上是文... 查看详情

在html网页中如何实行树状图显示呀

参考技术A用以下代码结构模拟树形:<ul><li><ul><li></li><li></li></ul></li><li></li></ul> 参考技术B1、用table或div结合ul排版本回答被提问者采纳 查看详情

r数据可视化5:热图heatmap

...相关性。1)需要什么格式的数据有很多的软件都可以做heatmap。我们要介绍的当然是R,R默认中提供了heatmap函数。当然,R中也有很多具有heatmap功能的包,比如ggplot2,gplots。今天我们介绍含有heatmap.2功能的gplots包。heatmap.2函数和我... 查看详情

在距离高度从 SciPy 切割树状图/聚类树

...布时间】:2016-07-3103:28:52【问题描述】:我正在尝试学习如何在Python中使用dendrograms使用SciPy。我想获得集群并能够可视化它们;我听说hierarchicalclustering和dendrograms是最好的方法。如何在特定距 查看详情

执行双聚类(行和列)后如何在 heatmap.2 上添加 ColSideColors

】执行双聚类(行和列)后如何在heatmap.2上添加ColSideColors【英文标题】:HowtoaddColSideColorsonheatmap.2afterperformingbi-clustering(rowandcolumn)【发布时间】:2014-04-1206:39:59【问题描述】:我有以下代码:library(gplots)library(RColorBrewer);setwd("~/De... 查看详情

带有名称的 Scipy 树状图

...endrogram的调用中添加labels=names,但这没有帮助。有谁知道如何给这个添加标签? 查看详情

如何调整树状图的y轴大小

】如何调整树状图的y轴大小【英文标题】:Howtoresizeyaxisofadendogram【发布时间】:2013-10-0523:31:36【问题描述】:我在进行层次聚类后使用scipy.cluster.hierarchyassch绘制树状图。问题是聚类发生在树状图的顶部,介于0.8和1.0之间,这是... 查看详情

怎样用excel做树状图?

...在弹出的对话框中选择“层次结构。4、随意选择了一种树状图,弹出的树状图如下,图中的文字部分可以更改成需要的内容。5、更改树状图形状:选择任意需要更改的树状图单元,鼠标右键单击,在弹出的菜单中选择“更改形... 查看详情

在R中使用dendextend修改树状图

】在R中使用dendextend修改树状图【英文标题】:DendrogrammodificationusingdendextendinR【发布时间】:2016-08-1313:43:08【问题描述】:我正在尝试使用dendextend修改和调整集群树状图,使用以下代码:#preparehierarchicalclusterhc=hclust(dist(mtcars))den... 查看详情

在 Scipy/Matplotlib 中注释树状图节点

】在Scipy/Matplotlib中注释树状图节点【英文标题】:AnnotatingDendrogramnodesinScipy/Matplotlib【发布时间】:2015-07-3019:30:17【问题描述】:我正在尝试在scipy.cluster.hierarchy.dendrogram生成的树状图中标记节点。我正在使用augmenteddendrogramsuggeste... 查看详情

如何在python中提取树状图中点之间的距离?

】如何在python中提取树状图中点之间的距离?【英文标题】:HowcanIextractthedistancesbetweenpointswithinadendograminpython?【发布时间】:2021-06-2706:25:59【问题描述】:我在python中执行层次聚类并获得了树状图。我想知道是否有一种方法可... 查看详情

将因子映射到 heatmap.2 中的颜色

】将因子映射到heatmap.2中的颜色【英文标题】:Mappingfactorstocolorsinheatmap.2【发布时间】:2013-08-0211:12:28【问题描述】:您好,我正在使用heatmap.2在R中制作热图。我想使用RowSideColors选项。但是,我不知道如何轻松地为行创建颜色... 查看详情

更改绘图表达树状图的悬停文本

...,而不是父项或ID。我已经用plotlyexpress定义了它。无论我如何修改它,我都无法将悬停文本限制在我需要的字段中。检查代码并捕获importplotly.expressaspxfig=px.treemap(df 查看详情

在 scipy 中修剪树状图(分层聚类)

】在scipy中修剪树状图(分层聚类)【英文标题】:Pruningdendrograminscipy(hierarchicalclustering)【发布时间】:2012-05-0512:21:14【问题描述】:我有一个包含大约5000个条目的距离矩阵,并使用scipy的层次聚类方法对矩阵进行聚类。我用于... 查看详情