python 如何在d3js NetworkX diGraph中超链接节点

eit6fx6z  于 6个月前  发布在  Python
关注(0)|答案(3)|浏览(56)

我想创建一个NetworkX图,并使用d3js将其可视化,类似于NetworkX文档中的JavaScript示例。此图与NetworkX主页page上的交互式图非常相似。
这个例子对我来说很好用,但是我想给节点添加超链接。我想我有一个名为“xlink:href”的节点属性,但是我还没有弄清楚怎么做。
这个问题是针对NewworkX和bokeh here的可视化而回答的。我没有测试这个例子,因为我想使用d3js。下面的代码是可用的here
到目前为止:

import json
import networkx as nx

G = nx.Graph()
G.add_node('Node1')
G.add_node('Node2')
G.add_edge('Node1', 'Node2')

for n in G:
    G.nodes[n]["name"] = "My" + str(n) 
    G.nodes[n]["xlink:href"] = "http://google.com"  # <==<< link Not working

d = nx.json_graph.node_link_data(G)

json.dump(d, open("force/force.json", "w"))
print("Wrote node-link JSON data to force/force.json")

字符串
以上产生:

{'directed': False,
 'multigraph': False,
 'graph': {},
 'nodes': [{'name': 'MyNode1',
   'xlink:href': 'http://google.com',
   'id': 'Node1'},
  {'name': 'MyNode2', 'xlink:href': 'http://google.com', 'id': 'Node2'}],
 'links': [{'source': 'Node1', 'target': 'Node2'}]}


它可以这样可视化:

# Serve the file over http to allow for cross origin requests
import flask
app = flask.Flask(__name__, static_folder="force")

@app.route("/")
def static_proxy():
    return app.send_static_file("force.html")
app.run(port=8001)


的数据
有趣的是,图上的工具提示显示“Node2”而不是“MyNode2”。
在尝试解决此问题时收集的链接:

tcomlyy6

tcomlyy61#

这里有一个使用gravis的解决方案,它接受来自NetworkX,iGraph,graph-tool和其他一些Python库的图形对象,并可以通过一个函数调用使用d3.js,vis.js或three.js可视化它们。
免责声明:我是gravis的开发人员。您的用例似乎是1)使用d3创建交互式图形可视化,2)通过Web服务器(如Flask)提供服务。由于这是构建gravis的动机之一,我认为它可能适合这里。

import gravis as gv
import networkx as nx

g = nx.Graph()
g.add_node('Node1')
g.add_node('Node2')
g.add_edge('Node1', 'Node2')

for n in g:
    g.nodes[n]["name"] = f"My {n}" 
    g.nodes[n]["hover"] = '<a href="http://google.com">Google</a>'

fig = gv.d3(g, node_label_data_source='name')
fig.display()

字符串
最后一行打开一个浏览器窗口,并显示可视化。或者,您也可以使用fig.to_html()来获取一个独立的HTML文本,您可以通过Flask等Web服务器提供。当鼠标悬停在节点上时,超链接会显示出来,并且可以很容易地点击,因为弹出窗口会延迟一段时间消失。
另一个可以轻松提供的用例是在一个小型笔记本中创建嵌入式图形可视化,这可能有助于对应用程序进行原型设计:x1c 0d1x
(The鼠标光标在屏幕截图中被隐藏了。它悬停在节点1上,因此带有超链接的弹出窗口是可见的。)

cxfofazt

cxfofazt2#

我从来没有使用过 JavaScript,但似乎你只需要更新force.js的第36行:

node.append("title")
        .text(function (d) {
            return d.name; // << instead of d.id
        });

字符串
预览(at http://127.0.0.1:8001/):


的数据

rjee0c15

rjee0c153#

这是我从@Robert哈斯answer中得到的。这段代码保存了一个独立的html文件,其中包含所有尼德js和通过悬停从节点到本地文件的链接。

import gravis as gv
import networkx as nx
from pathlib import Path

g = nx.Graph()
g.add_node('Node1')
g.add_node('Node2')
g.add_edge('Node1', 'Node2')

g.nodes['Node1']["name"] = f"MyNode1"
g.nodes['Node1']["hover"] = '<a href="snippet1.md">snippet1</a>'

g.nodes['Node2']["name"] = f"MyNode2"
g.nodes['Node2']["hover"] = '<a href="snippet2.md">snippet2</a>'

fig = gv.d3(g, node_label_data_source='name')

page = fig.to_html_standalone()

Path("gravis.html").write_text(page)

字符串

相关问题