scipy 树形图转 json 用于 d3.js 树可视化

2024-01-09

我正在尝试将 scipy 层次聚类的结果转换为 json 以在 d3.js 中显示一个例子 http://bl.ocks.org/mbostock/4063550

以下代码生成具有 6 个分支的树状图。

import pandas as pd 
import scipy.spatial
import scipy.cluster

d = {'employee' : ['A', 'B', 'C', 'D', 'E', 'F'],
 'skillX': [2,8,3,6,8,10],
 'skillY': [8,15,6,9,7,10]}

d1 = pd.DataFrame(d)

distMat = xPairWiseDist = scipy.spatial.distance.pdist(np.array(d1[['skillX', 'skillY']]), 'euclidean')
clusters = scipy.cluster.hierarchy.linkage(distMat, method='single')
dendo  = scipy.cluster.hierarchy.dendrogram(clusters, labels = list(d1.employee), orientation = 'right')

dendo

我的问题如何以 d3.js 理解的格式表示 json 文件中的数据

{'name': 'Root1’, 
      'children':[{'name' : 'B'},
                  {'name': 'E-D-F-C-A',
                           'children' : [{'name': 'C-A',
                                         'children' : {'name': 'A'}, 
                                                      {'name' : 'C'}]
                                                 }
                   }
                   ]
}

令人尴尬的事实是,我不知道是否可以从树状图 http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.dendrogram.html或从连接矩阵 http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html#scipy.cluster.hierarchy.linkage and how

我很感谢我能得到的任何帮助。

编辑以澄清

到目前为止,我已经尝试使用totree http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.to_tree.html#scipy.cluster.hierarchy.to_tree方法,但很难理解其结构(是的,我阅读了文档)。

a = scipy.cluster.hierarchy.to_tree(clusters , rd=True)

for x in a[1]:
 #print x.get_id()
 if x.is_leaf() != True :
     print  x.get_left().get_id(), x.get_right().get_id(), x.get_count()

您可以通过三个步骤来完成此操作:

  1. 递归构造一个嵌套字典,表示 Scipy 返回的树to_tree http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.to_tree.html#scipy.cluster.hierarchy.to_tree method.
  2. 迭代嵌套字典,用其子树中的叶子标记每个内部节点。
  3. dump http://docs.python.org/2/library/json.html#json.dump将生成的嵌套字典转换为 JSON 并加载到 d3 中。

构建表示树状图的嵌套字典

第一步,拨打电话很重要to_tree with rd=False以便返回树状图的根。从该根开始,您可以构造嵌套字典,如下所示:

# Create a nested dictionary from the ClusterNode's returned by SciPy
def add_node(node, parent ):
    # First create the new node and append it to its parent's children
    newNode = dict( node_id=node.id, children=[] )
    parent["children"].append( newNode )

    # Recursively add the current node's children
    if node.left: add_node( node.left, newNode )
    if node.right: add_node( node.right, newNode )

T = scipy.cluster.hierarchy.to_tree( clusters , rd=False )
d3Dendro = dict(children=[], name="Root1")
add_node( T, d3Dendro )
# Output: => {'name': 'Root1', 'children': [{'node_id': 10, 'children': [{'node_id': 1, 'children': []}, {'node_id': 9, 'children': [{'node_id': 6, 'children': [{'node_id': 0, 'children': []}, {'node_id': 2, 'children': []}]}, {'node_id': 8, 'children': [{'node_id': 5, 'children': []}, {'node_id': 7, 'children': [{'node_id': 3, 'children': []}, {'node_id': 4, 'children': []}]}]}]}]}]}

基本思想是从不在树状图中的节点开始,该节点将充当整个树状图的根。然后我们递归地将左子节点和右子节点添加到这个字典中,直到到达叶子。此时,我们还没有节点的标签,因此我只是通过节点的 clusterNode ID 来标记节点。

标记树状图

接下来,我们需要使用 node_ids 来标记树状图。这些评论应该足以解释它是如何工作的。

# Label each node with the names of each leaf in its subtree
def label_tree( n ):
    # If the node is a leaf, then we have its name
    if len(n["children"]) == 0:
        leafNames = [ id2name[n["node_id"]] ]

    # If not, flatten all the leaves in the node's subtree
    else:
        leafNames = reduce(lambda ls, c: ls + label_tree(c), n["children"], [])

    # Delete the node id since we don't need it anymore and
    # it makes for cleaner JSON
    del n["node_id"]

    # Labeling convention: "-"-separated leaf names
    n["name"] = name = "-".join(sorted(map(str, leafNames)))

    return leafNames

label_tree( d3Dendro["children"][0] )

转储为 JSON 并加载到 D3 中

最后,在树状图被标记后,我们只需将其输出为 JSON 并加载到 D3 中。为了完整起见,我只是在此处粘贴 Python 代码以将其转储为 JSON。

# Output to JSON
json.dump(d3Dendro, open("d3-dendrogram.json", "w"), sort_keys=True, indent=4)

Output

我创建了下面的树状图的 Scipy 和 D3 版本。对于 D3 版本,我只需插入我输出的 JSON 文件('d3-dendrogram.json')进入这个Gist http://bl.ocks.org/mbostock/4063570.

SciPy 树状图

D3 树状图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy 树形图转 json 用于 d3.js 树可视化 的相关文章

随机推荐

  • 单独类库中数据注释的本地化

    我们正在尝试为我们的域模型实现本地化 这些模型存在于我们的解决方案中的单独的类库项目中 然而 我们无法让它工作 因为我们的模型数据注释属性根本没有被翻译 项目结构 Solution Web project 资源文件夹 包含 resx 文件
  • 如何制作一个永不结束的迭代器?

    我只是想知道无限期地迭代集合的最简单方法是什么 即当它到达末尾时next 调用第一个对象 我假设这不是 Java 中预定义的函数 所以只是寻找在 Java 中实现它的最简单方法 有一个方法很优秀谷歌收藏 https github com g
  • 如何使用 conda 或 virtualenv 在虚拟环境之间共享包?

    我有多个 python 项目 每个项目都有自己的虚拟环境 另外我有一个全局 python 环境 我想在虚拟 全局环境之间共享相同的包文件 而不需要多次复制它们 如果可能 Environment Packages GLOBAL A B C D
  • 在编译时完全枚举 D 维数组的索引

    为了测试一些多维结构 需要生成编译时多维索引以完全覆盖所有可能的情况 我寻找编译时廉价的方法来实现上述目的 我目前所做的 include
  • java 10 中使用局部变量类型推断的限制

    Java 10引入了局部变量类型推断特征JEP 286 http openjdk java net jeps 286 我们可以使用局部变量类型推断var这是保留类型名称 但使用它有一些限制 有人可以总结一下在哪些情况下我将无法使用 var
  • 如何在android的城市飞艇中注册apid?

    I have completed client side code by download sample from git for push notification in android After execute of app i go
  • 有条件地更改 Razor 视图中的 CSS 类

    我需要更改 CSS 类 div 带有 forumChild 类的标签 它必须每 3 个循环更改一次 foreach 循环 有没有办法在控制范围内做到这一点 div class Forum p The Forum p foreach var
  • 是否可以在同一帧中打开新的 fxml 文件

    我在锚点窗格中创建了 fxml 文件 但每次我单击按钮时 我都会在新框架中得到下一个 fxml 我希望它在同一帧中打开 public void baropen ActionEvent event handle the event here
  • 导航栏按钮和项目未在 swift 3 中显示

    我在 swift 中以编程方式使用导航栏 但无法在导航栏中显示栏按钮项目 这是我所做的代码 override func viewDidLoad super viewDidLoad let navBar UINavigationBar UIN
  • 存在主义类型。为异构映射编写类的实例

    使用以下类型和类定义 我不明白为什么在创建时会出现错误instance below 我需要 MyMap 来保存异构值的映射 LANGUAGE ExistentialQuantification module Scratch SO Extis
  • 在 Three.js 中将材质分配给 OBJLoader 模型

    我使用以下代码导入了 OBJ 模型 var loader new THREE OBJLoader loader addEventListener load function geometry object geometry content
  • 卸载前检查应用程序是否在 NSIS 中运行

    我是 NSIS 新手 我需要知道在卸载程序中 如何检查应用程序 C 中的 是否正在运行并在卸载之前将其关闭 这是一个稍微更友好的使用版本NS进程 http nsis sourceforge net NsProcess plugin请求应用程
  • 如何在 React 中创建可重用的自定义模态组件?

    我对 React 中的模态概念有疑问 当使用带有 jQ uery 的服务器端渲染模板时 我习惯于有一个始终可用的空全局模态模板 包含在始终扩展的基本模板中 然后 当进行 AJAX 调用时 我只是填充模态 如下所示 modal global
  • 如何在 Flutter 中设置折叠元素的动画

    当用户用动画点击不同的小部件 同级或父级 时 如何展开和折叠小部件 new Column children
  • 如何在 Android 手机上模拟 NFC 标签

    我有一部 Android 手机 nexus s sdk v15 它应使用标签仿真将字符串发送到在 nfc 读取器 写入器模式下运行的开发板 我知道这不是 Android 官方支持的 所以我可以通过直接访问驱动程序来本地完成它 是否有任何人以
  • 如何从 Uri 获取位图?

    如何从 Uri 获取 Bitmap 对象 如果我成功将其存储在 data data MYFOLDER myimage png or file data data MYFOLDER myimage png 在我的应用程序中使用它 有谁知道如何
  • 如何对 MongoDB 中的字段进行加密

    我需要加密 mongo 文档中的一个字段 最好的方法是什么 我用弹簧 有spring注解吗 目前只能通过 java 进行加密 here https stackoverflow com questions 28936242 encrypt p
  • IE8异步文件上传

    我试图找到在 IE8 中异步上传文件 通过 Ajax 的示例代码 上传进度也很好 但不是强制性的 我希望 PHP 代码能够处理文件服务器端 我不断遇到其他浏览器使用 FormData 的示例 但我无法使用它 有人可以指出我正确的方向吗 这是
  • 为什么 :required => true 不适用于 collection_select?

    我想确保用户在提交之前在我的表单中选择一个类别 但是 required gt true似乎不起作用 这是选择 有什么建议吗 Try this 解释 根据 Rails 文档 语法为collection select函数看起来像这样 colle
  • scipy 树形图转 json 用于 d3.js 树可视化

    我正在尝试将 scipy 层次聚类的结果转换为 json 以在 d3 js 中显示一个例子 http bl ocks org mbostock 4063550 以下代码生成具有 6 个分支的树状图 import pandas as pd i