我使用的是dendrogram从scipy使用绘制层次聚类matplotlib如下:
mat = array([[1, 0.5, 0.9],
[0.5, 1, -0.5],
[0.9, -0.5, 1]])
plt.subplot(1,2,1)
plt.title("mat")
dist_mat = mat
linkage_matrix = linkage(dist_mat,
"single")
print "linkage2:"
print linkage(1-dist_mat, "single")
dendrogram(linkage_matrix,
color_threshold=1,
labels=["a", "b", "c"],
show_leaf_counts=True)
plt.subplot(1,2,2)
plt.title("1 - mat")
dist_mat = 1 - mat
linkage_matrix = linkage(dist_mat,
"single")
dendrogram(linkage_matrix,
color_threshold=1,
labels=["a", "b", "c"],
show_leaf_counts=True)
Run Code Online (Sandbox Code Playgroud)
我的问题是:第一,为什么mat和1-mat在这里给同一聚类?第二,如何使用树的每个分支来注释距离,dendrogram以便可以比较节点对之间的距离?
最后似乎show_leaf_counts忽略了标志,有没有办法打开它,以便显示每个类中的对象数量?谢谢.
我正在尝试使用children_提供的属性构建树形图AgglomerativeClustering,但到目前为止我运气不好.我无法使用,scipy.cluster因为提供的凝聚聚类scipy缺少一些对我很重要的选项(例如指定聚类数量的选项).我真的很感激那里的任何建议.
import sklearn.cluster
clstr = cluster.AgglomerativeClustering(n_clusters=2)
clusterer.children_
Run Code Online (Sandbox Code Playgroud) 我已经编写了自己的聚类程序,并希望生成一个树形图.最简单的方法是使用scipy树形图函数.但是,这要求输入的格式与scipy linkage函数产生的格式相同.我找不到如何格式化输出的示例.我想知道是否有人可以启发我.
我遇到过这种情节,它在给定的一组时间序列数据上执行分层聚类.谁能告诉我如何绘制这样的情节?
我对RJavascript中的实现持开放态度,特别是使用d3.js.

我正试图画一个完整的链接scipy.cluster.hierarchy.dendrogram,我发现它scipy.cluster.hierarchy.linkage比慢sklearn.AgglomerativeClustering.
但是,sklearn.AgglomerativeClustering不返回簇之间的距离和原始观测的数量,这是scipy.cluster.hierarchy.dendrogram需要的.有办法接受它们吗?
我在R中使用ape(分析系统发育和进化)包,它具有树状图绘制功能.我使用以下命令以Newick格式读取数据,并使用绘图函数绘制树形图:
__CODE__
__CODE__
__CODE__
由于数据集非常大,因此无法在树的较低层中看到任何细节.我只看到黑色区域,但没有细节.我只能从顶部看到几个级别,然后没有细节.
我想知道绘图功能是否有任何缩放功能.我尝试使用xLim和yLim来限制区域,但是,它们只是限制了区域,并且不进行缩放以使细节可见.缩放或在不缩放的情况下使细节可见将解决我的问题.
我也很高兴知道任何其他包,功能或工具,可以帮助我克服这个问题.
谢谢.
我有heatmap(来自一组样本的基因表达):
set.seed(10)
mat <- matrix(rnorm(24*10,mean=1,sd=2),nrow=24,ncol=10,dimnames=list(paste("g",1:24,sep=""),paste("sample",1:10,sep="")))
dend <- as.dendrogram(hclust(dist(mat)))
row.ord <- order.dendrogram(dend)
mat <- matrix(mat[row.ord,],nrow=24,ncol=10,dimnames=list(rownames(mat)[row.ord],colnames(mat)))
mat.df <- reshape2::melt(mat,value.name="expr",varnames=c("gene","sample"))
require(ggplot2)
map1.plot <- ggplot(mat.df,aes(x=sample,y=gene))+geom_tile(aes(fill=expr))+scale_fill_gradient2("expr",high="darkred",low="darkblue")+scale_y_discrete(position="right")+
theme_bw()+theme(plot.margin=unit(c(1,1,1,-1),"cm"),legend.key=element_blank(),legend.position="right",axis.text.y=element_blank(),axis.ticks.y=element_blank(),panel.border=element_blank(),strip.background=element_blank(),axis.text.x=element_text(angle=45,hjust=1,vjust=1),legend.text=element_text(size=5),legend.title=element_text(size=8),legend.key.size=unit(0.4,"cm"))
Run Code Online (Sandbox Code Playgroud)
(由于plot.margin我正在使用的论据,左侧被切断,但我需要这个,如下所示).
然后,我prune行dendrogram根据深度截止值来获得较少的集群(即,只有深深的分裂),并做一些编辑所产生dendrogram有它绘制他们的方式,我希望它:
depth.cutoff <- 11
dend <- cut(dend,h=depth.cutoff)$upper
require(dendextend)
gg.dend <- as.ggdend(dend)
leaf.heights <- dplyr::filter(gg.dend$nodes,!is.na(leaf))$height
leaf.seqments.idx <- which(gg.dend$segments$yend %in% leaf.heights)
gg.dend$segments$yend[leaf.seqments.idx] <- max(gg.dend$segments$yend[leaf.seqments.idx])
gg.dend$segments$col[leaf.seqments.idx] <- "black"
gg.dend$labels$label <- 1:nrow(gg.dend$labels)
gg.dend$labels$y <- max(gg.dend$segments$yend[leaf.seqments.idx])
gg.dend$labels$x <- gg.dend$segments$x[leaf.seqments.idx]
gg.dend$labels$col <- "black"
dend1.plot <- ggplot(gg.dend,labels=F)+scale_y_reverse()+coord_flip()+theme(plot.margin=unit(c(1,-3,1,1),"cm"))+annotate("text",size=5,hjust=0,x=gg.dend$label$x,y=gg.dend$label$y,label=gg.dend$label$label,colour=gg.dend$label$col)
Run Code Online (Sandbox Code Playgroud)
require(cowplot)
plot_grid(dend1.plot,map1.plot,align='h',rel_widths=c(0.5,1)) …Run Code Online (Sandbox Code Playgroud) 我有两个树形图,我希望相互比较,以找出它们是如何"相似".但我不知道有任何方法可以这样做(更不用说实现它的代码了,比方说,在R中).
任何线索?
更新(2014-09-13):
自从提出这个问题以来,我编写了一个名为dendextend的R包,用于树形图的可视化,操作和比较.此软件包在CRAN上,附带详细的插图.它包括诸如cor_cophenetic,cor_bakers_gamma和Bk/ Bk_plot.以及tanglegram用于在视觉上比较两棵树的功能.
对于项目,我需要以交互方式更改可视化的分层数据布局 - 无需任何基础数据的任何更改.能够在它们之间切换的布局应该是树,簇,径向树和径向簇.转换应该最好是动画.
我认为这将是相对容易的任务D3.我开始了,但是我在翻译和轮换,数据绑定等方面迷失了,所以我向你寻求帮助.此外,我可能正在做的不是D3的精神,这是不好的,因为我正在寻求一个干净的解决方案.
我把一个jsfidle放在一起,但它只是一个起点,增加了单选按钮,方便的小数据集和初始集群布局 - 只是为了帮助任何想看看它的人.提前致谢!
更新:
我只想专注于链接,所以我暂时禁用其他元素.在@AmeliaBR方法的基础上,获得以下动画:

这是更新的jsfiddle.
更新2:
现在用圈子:(原谅我选择的颜色)
{末日毒霸-末日}

这是我在下面得到的图,但我希望它看起来像截断的树状图,astrodendro如下所示:
还有一个从一个非常酷的树状图看本文,我想在重新创建matplotlib.
下面是生成iris带有噪声变量的数据集并绘制树形图的代码matplotlib.
有谁知道如何:(1)截断分支,如示例图中; 和/或(2)使用astrodendro自定义链接矩阵和标签?
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import astrodendro
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial import distance
def iris_data(noise=None, palette="hls", desat=1):
# Iris dataset
X = pd.DataFrame(load_iris().data,
index = [*map(lambda x:f"iris_{x}", range(150))],
columns = [*map(lambda x: x.split(" (cm)")[0].replace(" ","_"), load_iris().feature_names)])
y = pd.Series(load_iris().target,
index = X.index,
name = "Species")
c = map_colors(y, mode=1, palette=palette, desat=desat)#y.map(lambda …Run Code Online (Sandbox Code Playgroud) dendrogram ×10
python ×5
r ×4
plot ×3
d3.js ×2
ggplot2 ×2
matplotlib ×2
scipy ×2
cowplot ×1
dendextend ×1
heatmap ×1
hierarchy ×1
javascript ×1
numpy ×1
scikit-learn ×1
statistics ×1
tree ×1
zoom ×1