我想编写代码来在python中绘制树形图.有一个简单的方法来实现它.
我编写的代码可以识别点数据集中的聚类,并希望生成一个树形图,显示每次迭代生成的聚类数量
例如,当我在这个数据集上运行我的代码时,第一次迭代得到1个集群

和第二次迭代的2个聚类

所以我想制作能够展示这一点的东西.但不知道从哪里开始

每个点都有一个'label'属性,该属性是每次迭代后该点所在的每个簇的列表.
也就是说,在这个例子中,一些点标签属于[0,0],而其他点是[0,1].所以,如果我使用scipy树形图,我将如何从这到连接格式
我产生这种树状图,使用R的hclust(),as.dendrogram()和plot.dendrogram()功能.
我使用dendrapply()函数和局部函数来为叶子着色,这很好.
我有统计测试的结果,表明一组节点(例如树的右下角的" _+v\_stat5a\_01_"和" _+v\_stat5b\_01_" 的簇)是重要的还是重要的.
我还有一个可以使用的本地函数,dendrapply()它在我的树形图中找到包含重要叶子的确切节点.
我想(根据例子):
_+v\_stat5a\_01_"和" _+v\_stat5b\_01_" 的边缘着色; 要么,rect()" _+v\_stat5a\_01_"和" _+v\_stat5b\_01_"我有以下本地函数("nodes-in-leafList-match-nodes-in-clusterList"条件的详细信息并不重要,但它突出显示了重要的节点):
markSignificantClusters <<- function (n) {
if (!is.leaf(n)) {
a <- attributes(n)
leafList <- unlist(dendrapply(n, listLabels))
for (clusterIndex in 1:length(significantClustersList[[1]])) {
clusterList <- unlist(significantClustersList[[1]][clusterIndex])
if (nodes-in-leafList-match-nodes-in-clusterList) {
# I now have a node "n" that contains significant leaves, and
# I'd like …Run Code Online (Sandbox Code Playgroud) 我想在R中创建一个树状图,它有彩色分支,如下图所示.

到目前为止,我使用以下命令创建标准树形图:
d <- dist(as.matrix(data[,29])) # find distance matrix
hc <- hclust(d) # apply hirarchical clustering
plot(hc,labels=data[,1], main="", xlab="") # plot the dendrogram
Run Code Online (Sandbox Code Playgroud)
我该如何修改此代码以获得所需的结果?
在此先感谢您的帮助.
我试图将层次聚类的结果绘制R为树状图,矩形识别聚类.
下面的代码用于垂直树形图,但对于水平树形图(horiz=TRUE),不绘制矩形.有没有办法对水平树形图做同样的事情.
library("cluster")
dst <- daisy(iris, metric = c("gower"), stand = FALSE)
hca <- hclust(dst, method = "average")
plot(as.dendrogram(hca), horiz = FALSE)
rect.hclust(hca, k = 3, border = "red")
Run Code Online (Sandbox Code Playgroud)
此外,我想绘制一条线来切割所需距离值的树.如何在R中绘制该cutree函数.函数返回聚类,但是也可以绘制它.
cutree(hca, k = 3)
Run Code Online (Sandbox Code Playgroud)
我正在寻找的所需输出是这样的.

如何在R中完成这项工作?
我正在尝试使用SciPy的dendrogram方法根据阈值将数据切割成多个簇.但是,一旦我创建了树形图并检索它color_list,列表中的条目就少于标签.
或者,我尝试使用fcluster我确定的相同阈值dendrogram; 但是,这不会产生相同的结果 - 它给了我一个集群而不是三个集群.
这是我的代码.
import pandas
data = pandas.DataFrame({'total_runs': {0: 2.489857755536053,
1: 1.2877651950650333, 2: 0.8898850111727028, 3: 0.77750321282732704, 4: 0.72593099987615461, 5: 0.70064977003207007,
6: 0.68217502514600825, 7: 0.67963194285399975, 8: 0.64238326692987524, 9: 0.6102581538587678, 10: 0.52588765899448564,
11: 0.44813665774322564, 12: 0.30434031343774476, 13: 0.26151929543260161, 14: 0.18623657993534984, 15: 0.17494230269731209,
16: 0.14023670906519603, 17: 0.096817318756050832, 18: 0.085822227670014059, 19: 0.042178447746868117, 20: -0.073494398270518693,
21: -0.13699665903273103, 22: -0.13733324345373216, 23: -0.31112299949731331, 24: -0.42369178918768974, 25: -0.54826542322710636,
26: -0.56090603814914863, 27: -0.63252372328438811, 28: -0.68787316140457322, 29: -1.1981351436422796, 30: …Run Code Online (Sandbox Code Playgroud) 我对 HTML 和 JavaScript 还很陌生。我面临着著名的分层边缘捆绑,它是由 D3.js 库生成的。
我的目标是添加一个半圆形标签区域以获得这样的效果:每个最终节点组都标有父节点的名称。

不幸的是,除了上面链接中提供的代码之外,我还没有找到任何可以从中获得灵感的代码:我的想法是修改该代码,添加一些行以生成标签。
我看到这个链接,其中包含一段可能可以解决问题的代码片段,但我不知道如何使用它(以及我是否处于正确的方向)
node.append("text")
.attr("dy", ".31em")
.attr("x", function(d) { return d.x < 180 === !d.children ? 6 : -6; })
.style("text-anchor", function(d) { return d.x < 180 === !d.children ? "start" : "end"; })
.attr("transform", function(d) { return "rotate(" + (d.x < 180 ? d.x - 90 : d.x + 90) + ")"; })
.text(function(d) { return d.id.substring(d.id.lastIndexOf(".") + 1); });
Run Code Online (Sandbox Code Playgroud)
有人有什么建议吗?
我有一个简单的二维数据集,我希望以凝聚的方式聚类(不知道要使用的最佳聚类数).我能够成功聚类数据的唯一方法是给函数一个'maxclust'值.
为简单起见,我们假设这是我的数据集:
X=[ 1,1;
1,2;
2,2;
2,1;
5,4;
5,5;
6,5;
6,4 ];
Run Code Online (Sandbox Code Playgroud)
当然,我希望这些数据形成2个集群.我明白,如果我知道这一点,我可以说:
T = clusterdata(X,'maxclust',2);
Run Code Online (Sandbox Code Playgroud)
并找出每个群集中的哪些点我可以说:
cluster_1 = X(T==1, :);
Run Code Online (Sandbox Code Playgroud)
和
cluster_2 = X(T==2, :);
Run Code Online (Sandbox Code Playgroud)
但是,如果不知道2个群集对于此数据集是最佳的,我该如何对这些数据进行聚类?
谢谢
我知道树状图很受欢迎.但是,如果有大量的观察和课程,很难遵循.但是有时我觉得应该有更好的方式呈现相同的东西.我有一个想法,但不知道如何实现它.
考虑以下树形图.
> data(mtcars)
> plot(hclust(dist(mtcars)))
Run Code Online (Sandbox Code Playgroud)

可以将其绘制成散点图.其中两点之间的距离用线绘制,而sperate簇(假设阈值)是彩色的,圆的大小由一些变量的值确定.

我可以在Python树形图中为标签着色,但我不知道如何对属于其标签的链接的部分进行着色..我想做这样的事情:

在Python中有可能吗?
这里我只标注颜色:
import numpy as np
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as sc
dists = np.array([[0,2,1,4],[2,0,3,5],[1,3,0,6],[4,5,6,0]])
l = ['a','b','c','b']
Z = sc.linkage(dists, method='complete')
d = sc.dendrogram(Z, labels=l)
label_colors = {'a': 'r', 'b': 'g', 'c': 'm'}
ax = plt.gca()
xlbls = ax.get_xmajorticklabels()
for i in range(len(xlbls)):
xlbls[i].set_color(label_colors[xlbls[i].get_text()])
plt.show()
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在R中运行层次聚类分析后生成了一个树形图.我现在尝试根据另一个因子变量为标签着色,该变量保存为矢量.我实现这一目标的最接近的方法是使用包中的ColourDendrogram函数对分支进行颜色编码sparcl.如果可能的话,我更愿意对标签进行颜色编码.我在以下链接中找到了类似问题的答案在树形图中使用现有列和着色分支的树形图的颜色分支,但是我还没有能够找到如何为我的目的转换示例代码.下面是一些示例数据和代码.
> dput(df)
structure(list(labs = c("a1", "a2", "a3", "a4", "a5", "a6", "a7",
"a8", "b1", "b2", "b3", "b4", "b5", "b6", "b7"), var = c(1L,
1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L), td = c(13.1,
14.5, 16.7, 12.9, 14.9, 15.6, 13.4, 15.3, 12.8, 14.5, 14.7, 13.1,
14.9, 15.6, 14.6), fd = c(2L, 3L, 3L, 1L, 2L, 3L, 2L, 3L, 2L,
4L, 2L, 1L, 4L, 3L, 3L)), …Run Code Online (Sandbox Code Playgroud) dendrogram ×10
r ×5
dendextend ×3
python ×3
colors ×2
hclust ×2
scipy ×2
d3.js ×1
ggdendro ×1
html ×1
javascript ×1
matlab ×1
phylogeny ×1
plot ×1