如何在Python中创建如下代码示例所示的径向集群?

如何在Python中创建如下代码示例所示的径向集群?,python,numpy,scipy,cluster-analysis,dendrogram,Python,Numpy,Scipy,Cluster Analysis,Dendrogram,我发现了几个关于如何创建这些精确层次结构(至少我相信是这样)的示例,如下所示,这些示例非常有效,几乎实现了我所寻找的功能 [编辑]这是的代码的简化版本,现在应该更容易让人将其放入径向群集,而不是当前的群集形状 import scipy import pylab import scipy.cluster.hierarchy as sch def fix_verts(ax, orient=1): for coll in ax.collections: for pth in

我发现了几个关于如何创建这些精确层次结构(至少我相信是这样)的示例,如下所示,这些示例非常有效,几乎实现了我所寻找的功能

[编辑]这是的代码的简化版本,现在应该更容易让人将其放入径向群集,而不是当前的群集形状

import scipy
import pylab
import scipy.cluster.hierarchy as sch

def fix_verts(ax, orient=1):
    for coll in ax.collections:
        for pth in coll.get_paths():
            vert = pth.vertices
            vert[1:3,orient] = scipy.average(vert[1:3,orient]) 

# Generate random features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])

fig = pylab.figure(figsize=(8,8))

# Compute and plot the dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(D, method='single')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

fix_verts(ax2,0)
fig.savefig('test.png')

但我需要的不是树状结构,而是下图所示的径向集群


我相信您可以使用
networkx
软件包结合
matplotlib
来实现这一点。从
networkx
图库中查看以下示例:

一般来说,
networkx
有许多非常好的图形分析和绘图方法


我添加了一个函数
fix\U verts
,该函数合并树状图中每个“U”底部的垂直

试试这个:

import scipy
import pylab
import scipy.cluster.hierarchy as sch

def fix_verts(ax, orient=1):
    for coll in ax.collections:
        for pth in coll.get_paths():
            vert = pth.vertices
            vert[1:3,orient] = scipy.average(vert[1:3,orient]) 

# Generate random features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
    for j in range(40):
        D[i,j] = abs(x[i] - x[j])


fig = pylab.figure(figsize=(8,8))

# Compute and plot first dendrogram.
ax1 = fig.add_axes([0.09,0.1,0.2,0.6])
Y = sch.linkage(D, method='centroid')
Z1 = sch.dendrogram(Y, orientation='right')
ax1.set_xticks([])
ax1.set_yticks([])

# Compute and plot second dendrogram.
ax2 = fig.add_axes([0.3,0.71,0.6,0.2])
Y = sch.linkage(D, method='single')
Z2 = sch.dendrogram(Y)
ax2.set_xticks([])
ax2.set_yticks([])

# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.6])
idx1 = Z1['leaves']
idx2 = Z2['leaves']
D = D[idx1,:]
D = D[:,idx2]
im = axmatrix.matshow(D, aspect='auto', origin='lower', cmap=pylab.cm.YlGnBu)
axmatrix.set_xticks([])
fix_verts(ax1,1)
fix_verts(ax2,0)
fig.savefig('test.png')
结果是:


我希望这就是您所追求的。

我对这个问题进行了更多的研究,现在似乎最好创建一个新函数,直接从
链接
输出绘制
径向簇
(而不是对绘制的一个进行黑客攻击)。我可能最终会做点什么,但不会很快

我假设你的数据自然地承认这种径向嵌入。你证实了吗?
链接中是否有适合您的方法

似乎对于任何方法,
链接
都将返回二叉树结构。在你们的例子中,你们有更一般的树。您需要一些关于如何整合树节点的额外知识。这一切都准备好了,破坏原始树状图的想法就无效了

更新:
对于您的目的来说,这个天真的示例情节是否足够合理?如果是这样,我将能够发布一些非常简单的代码来实现它。

更新2

代码如下:

径向_demo.py:

从numpy导入r\ux、one、pi、sort
从numpy.random导入rand
从radial_grouper导入树、预订单、后订单
从radial_可视化工具导入简单_链接
从pylab导入轴、图形、绘图、子绘图
#ToDo:创建适当的文档
定义(sp、t、o):
子地块(sp)
t、 遍历(简单链接,顺序=o)
轴(“相等”)
def演示1(n):
p=r_u2;[2*pi*rand(1,n)-pi,one((1,n))]
t=树(p)
f=图()
_s(221,t,预订单)
_s(222,t,邮政订单)
t=tree(p,tols=sort(2e0*rand(9)))
_s(223,t,预订单)
_s(224,t,邮政订单)
f、 show()
#f.savefig('test.png'))
#ToDO:实现更多演示
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
演示1(123)
radial_grouper.py:

“”“所有分组功能都在此处收集。”“”
从集合导入namedtuple
从numpy导入r!,arange,argsort,array,one,pi,其中
从numpy导入逻辑_和as land
从径向支撑从极轴导入
__all_uuuuu=['tree'、'pre_uorder'、'post_uorder']
Node=namedtuple('Node','ndx lnk')
#ToDo:增强文档
定义接地人(p、tol、r):
g、 gm,gp=[],[],p-p[0]
尽管如此:
如果gp[-1]<0:中断
ndx=where(land)(0.与第一张图非常相似


你可以在他们的在线编辑器上使用它。超级酷,使用方便。

很有趣,但它看起来与OP提供的图片都不一样。我用你的代码根据你的代码的简化版本编辑了整篇文章(因为只使用一棵树,不需要格子图案和两棵树)你的代码示例为线性轴绘制树状图。你的图像示例有一个圆周轴。我不清楚你是否试图获得“Y”在长方体图上的径向图中可以找到形状分支,或者如果要复制径向图,请查看此示例:必须有一种方法可以将变换应用于此直线图以获得所需内容。我今天上午花了一点时间,但没有成功。不幸的是,po上的代码错误完全消失s=nx.graphviz_布局(G,prog='twopi',args='')行。但是导入似乎工作得很好。根据版本,我得到了nx.graphviz版本1.0rc1(networkx版本1.0rc1)我认为问题在于您需要单独安装GraphViz,因为我在运行示例代码时遇到的具体错误是:
InvocationException:GraphViz的可执行文件找不到
,但从理论上讲,如果您拥有所有必需的组件,那么此代码应该满足您的要求。有关可选软件包的链接,请参阅包括Graphviz就是这样,需要单独安装~使用了一个符咒来创建上面的示例,但是我不是在寻找一个平衡的_树,我的示例显示了一个不平衡的树,以及随机节点之间的连接。第一个是最好的示例。有没有关于networkx是否支持此功能的指针?只使用了平衡的_树在示例中,演示networkx的绘图功能,特别是圆形图形布局。这里有许多经典的图形生成器:包括随机图形。您可以使用其中一个,也可以使用包图形原语创建自己的自定义网络/图形。下面是另一个链接:我想我不清楚为什么要这样做ldn不要只使用
networkx
解决方案,除非他们真的希望重新发明轮子,并拥有一种不需要额外依赖项的方法。GraphViz是专门为此目的设计的强大工具。networkx解决方案很好,如果你能描述如何从它所描述的“平衡树”出发G=nx.balanced_tree(3,5)到一个不平衡树,使用它的术语。我的示例图片很好地显示了这一点,不是所有的叶节点都有相同的计数~@Morvern——请参阅我的注释,附在我的原始答案后,以了解