有没有办法生成树形图,其中图形的每个级别代表一代,并且每个级别只连接同一个父亲的儿子?
我试图使用R的hclust和绘图函数来生成父子谱系的树状图.期望的结果是树形图,其中每一代儿子被放置在他们父亲的同一条线上.
我希望hclust和"完整"方法允许我使用相异矩阵为同一个父亲的儿子分配0相异度分数,然后放在同一层级上,不包括数据集中的任何其他实体.这不起作用,在同一水平上有不同世代的儿子.
任何帮助是极大的赞赏!
以下是一些示例数据:
父亲,儿子
A,C
A,D
A,E
B,F
B,G
C,H
C,I
F,J
F,K
G,L
代理A有三个儿子:C,D和E; 和两个孙子通过C:H和I.
特工B有两个儿子:F和G; 共有三个孙子:J,K和L.
我是scipy的新手,但我设法得到了预期的树形图.我还有一些问题;
0由于图像边界而不可见.如何移除边框并将y轴的下限设为-1,以便清晰可见.例如,这些点之间的距离是0(13,17),(2,10),(4,8,19)0.4我的python代码:
import scipy
import pylab
import scipy.cluster.hierarchy as sch
import numpy as np
D = np.genfromtxt('LtoR.txt', dtype=None)
def llf(id):
return str(id)
fig = pylab.figure(figsize=(10,10))
Y = sch.linkage(D, method='single')
Z1 = sch.dendrogram(Y,leaf_label_func=llf,leaf_rotation=90)
fig.show()
fig.savefig('dendrogram.png')
Run Code Online (Sandbox Code Playgroud)
树状图:

谢谢.

我正在尝试使用由蛋白质dna相互作用组成的数据集,对数据进行聚类并生成热图,该热图显示结果数据,使得数据看起来与在对角线上排列的聚类聚集在一起.我能够对数据进行聚类并生成该数据的树形图,但是当我使用R中的热图函数生成数据的热图时,聚类不可见.如果你看前两个图像,一个是我能够生成的树形图,第二个是我能够生成的热图,第三个是集群热图的一个例子,它显示了我对结果的期望粗略地看.从比较第二和第三张图像可以看出,很明显第三张图像中有簇,而第二张图像中没有簇. 
这是我的数据集的链接:http: //pastebin.com/wQ9tYmjy
我能够聚集数据并在R中生成一个好的:
args <- commandArgs(TRUE);
matrix_a <- read.table(args[1], sep='\t', header=T, row.names=1);
location <- args[2];
matrix_d <- dist(matrix_a);
hc <- hclust(matrix_d,"average");
mypng <- function(filename = "mydefault.png") {
png(filename)
}
options(device = "mypng")
plot(hc);
我也可以生成热图也可以:
matrix_a <- read.table("Arda_list.txt.binary.matrix.txt", sep='\t', header=T, row.names=1);
mtscaled <- as.matrix(scale(matrix_a))
heatmap(mtscaled, Colv=F, scale='none')
我试着按照以下帖子:http: //digitheadslabnotebook.blogspot.com/2011/06/drawing-heatmaps-in-r.html by Christopher Bare,但我遗漏了一些东西.任何想法,将不胜感激.我附上了我得到的热图的图像,以及树形图.图3取自Christopher Bare的帖子.谢谢
r cluster-analysis hierarchical-clustering dendrogram heatmap
是否可以为Scipy的树状图的叶子标签指定颜色?我无法从文档中找到它.这是我到目前为止所尝试的:
from scipy.spatial.distance import pdist, squareform
from scipy.cluster.hierarchy import linkage, dendrogram
distanceMatrix = pdist(subj1.ix[:,:3])
dendrogram(linkage(distanceMatrix, method='complete'),
color_threshold=0.3,
leaf_label_func=lambda x: subj1['activity'][x],
leaf_font_size=12)
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在R中有一个树状图,我无法正确使用它.
我会告诉你问题是什么,请查看:http://img.photobucket.com/albums/v699/rica01/Rplot-1.png

如何在叶子上制作标签,它们之间的间距更大,间距更大?
谢谢.
-Ricardo
是否有一种简单的方法来计算hin的最小值,以cut产生给定最小尺寸的分组?
在此示例中,如果我希望每个集群至少包含十个成员,则应使用h = 3.80:
# using iris data simply for reproducible example
data(iris)
d <- data.frame(scale(iris[,1:4]))
hc <- hclust(dist(d))
plot(hc)
cut(as.dendrogram(hc), h=3.79) # produces 5 groups; group 4 has 7 members
cut(as.dendrogram(hc), h=3.80) # produces 4 groups; no group has <10 members
Run Code Online (Sandbox Code Playgroud)
由于分割的高度在中给出hc$height,因此我可以使用创建一组候选值hc$height + 0.00001,然后在每个分割处循环进行切割。不过,我不明白如何解析簇大小members出的dendrogram类。例如,cut(as.dendrogram(hc), h=3.80)$lower[[1]]$members返回NULL,而不是所需的66。
请注意,这是一个比使用包将树状图切成R中最小簇大小的n棵树更简单的问题dynamicTreeCut; 在这里,我没有指定树木的数量,而只是指定了最小的群集大小。TYVM。
我试图得到一个内部节点的高度dendrogram的BFS顺序.
该utils::str函数dendrogram按BFS顺序打印.所以我认为我会使用它(将输出重定向到文件并对其进行一些解析以获取我需要的信息).
我的'dendrogram'2个分支机构和5902个成员总共可下载RDS文件链接:dendro.RDS.
当我尝试:
utils::str(dendro)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error in getOption("OutDec") : node stack overflow
Error during wrapup: node stack overflow
Run Code Online (Sandbox Code Playgroud)
我尝试使用一个简单的递归函数:
nodeHeights <- function(dendro){
if(is.leaf(dendro))
0
else{
cat(attr(dendro,"height"),"\n")
max(nodeHeights(dendro[[1]]),nodeHeights(dendro[[2]]))+1
}
}
Run Code Online (Sandbox Code Playgroud)
但是:nodeHeights(dendro)
抛出此错误:
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)
任何的想法?或任何建议如何获得的节点高度dendrogram的BFS订单?
我为我的数据集生成了一个树状图,但我不满意如何对某些级别的拆分进行排序。因此,我正在寻找一种交换单个拆分的两个分支(或叶子)的方法。
如果我们看一下底部的代码和树状图,则有两个标签,11并且25与大集群的其余部分分开。我对此实在不满意,并希望带有11和25的分支成为拆分的右分支,而集群的其余部分成为左分支。所示的距离将仍然相同,因此数据不会改变,只是美观。
能做到吗?如何?我特别适合手动干预,因为最佳叶子排序算法在这种情况下可能无法正常工作。
import numpy as np
# random data set with two clusters
np.random.seed(65) # for repeatability of this tutorial
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[10,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[20,])
X = np.concatenate((a, b),)
# create linkage and plot dendrogram
from scipy.cluster.hierarchy import dendrogram, linkage
Z = linkage(X, 'ward')
plt.figure(figsize=(15, 5))
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('sample index')
plt.ylabel('distance')
dendrogram(
Z,
leaf_rotation=90., # …Run Code Online (Sandbox Code Playgroud) 用于网络社区检测的 Girvan-Newman 算法:
通过逐步从原始图中移除边来检测社区。该算法会在每一步删除“最有价值”的边缘,传统上是具有最高中介中心性的边缘。当图表分解成碎片时,紧密结合的社区结构暴露出来,结果可以用树状图来描述。
在 NetworkX 中,实现返回集合元组上的迭代器。第一个元组是由 2 个社区组成的第一个切割,第二个元组是由 3 个社区组成的第二个切割,依此类推,直到最后一个元组具有 n 个单独节点(树状图的叶子)的 n 个集合。
import networkx as nx
G = nx.path_graph(10)
comp = nx.community.girvan_newman(G)
list(comp)
Run Code Online (Sandbox Code Playgroud)
[({0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}), ({0, 1}, {2, 3, 4}, {5, 6, 7, 8 , 9}), ({0, 1}, {2, 3, 4}, {5, 6}, {8, 9, 7}), ({0, 1}, {2}, {3, 4 }, {5, 6}, {8, 9, 7}), ({0, 1}, {2}, {3, 4}, {5, 6}, {7}, {8, 9}) , ({0}, …
dendrogram ×10
r ×6
python ×4
scipy ×4
dendextend ×2
matplotlib ×2
bar-chart ×1
hclust ×1
heatmap ×1
networkx ×1
tree ×1