我已经找到了几个关于如何创建这些精确层次结构的示例(至少我相信它们是这样的),如下所示stackoverflow.com/questions/2982929/,它们工作得很好,几乎可以完成我想要的任务。
[编辑]这是Paul代码的一个简化版本,现在有人可以更容易地帮助将其转换成径向集群,而不是当前的集群形状
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')
但是,我需要一个类似下图的径向集群,而不是树状结构。
我添加了一个函数
fix_verts
,它合并了树状图中每个“U”底部的垂直点。试试这个:
结果是:
我希望这就是你想要的。
我相信您可以使用
networkx
包和matplotlib
来实现这一点。从networkx
库中查看以下示例:http://networkx.lanl.gov/examples/drawing/circular_tree.html
一般来说,
networkx
有很多非常好的图形分析和绘制方法我已经对这个问题进行了更多的研究,现在最好创建一个新函数,直接从
linkage
输出中绘制radial cluster
(而不是修改绘制的输出)。我可能最终会做点什么,但不会很快。我假设你的数据自然承认这种径向嵌入。你证实了吗?在
linkage
中是否存在适合您的方法?似乎对于任何方法
linkage
都将返回一个二叉树结构。在你的例子中,你有更一般的树。您需要一些如何合并树节点的额外知识。这一切都准备好了,这将使破解原始树状图的想法失效。更新:
对于你的目的来说,这个天真的例子情节是否足够合理?如果是这样的话,我可以发布一些非常简单的代码来实现它。
更新2:
代码如下:
径向演示.py:
放射状石斑鱼.py:
径向支撑.py:
径向可视化工具.py:
您可以找到源代码here。请随意修改它,但请保持未来的修改与要点同步。
相关问题 更多 >
编程相关推荐