使用 GraphML 文件进行 D3.js 强制导向布局

7
我该如何使用graphml文件在d3.js中绘制力导向图?
  • 将文件转换为.json格式是否更简单?如何转换?我没有找到转换器(我找到了一个Python转换器,但我不会使用Python)
  • 能否直接使用graphml文件?也许可以用d3.xml实现?

注意: graphml的格式如下:

<graph id="G" edgedefault="directed">
<node id="n0">
  <data key="v_name">JohnMaynardKe...</data>
  <data key="v_label">John Maynard Ke...</data>
  <data key="v_size">4</data>
  <data key="v_label.cex">0.3</data>
  <data key="v_frame.color">#ffffff00</data>
  <data key="v_color">#54FF00CC</data>
</node>
<node id="n1">
  <data key="v_name">JosephA.Schum...</data>
  <data key="v_label">Joseph A. Schum...</data>
  <data key="v_size">4</data>
  <data key="v_label.cex">0.3</data>
  <data key="v_frame.color">#ffffff00</data>
  <data key="v_color">#54FF00CC</data>
</node>
<edge source="n0" target="n1">
  <data key="e_nombre">2</data>
  <data key="e_width">2</data>
  <data key="e_arrow.size">0</data>
  <data key="e_color">#00000021</data>
</edge>
<edge source="n0" target="n7">
  <data key="e_nombre">2</data>
  <data key="e_width">2</data>
  <data key="e_arrow.size">0</data>
  <data key="e_color">#00000021</data>
</edge>

....

4个回答

7

我建议您将您的graphml文件转换为json文件。我遇到了同样的问题,以下是我使用Python和Networkx库将graphml文件转换为json的方法:

import networkx as nx
import json
from networkx.readwrite import json_graph
import re

G=nx.read_graphml('YourFile.graphml', unicode)
data = json_graph.node_link_data(G)

for node in data['nodes']:
  str=node['id']
  node['id']=[int(s) for s in str.split("n") if s.isdigit()][0]

with open('YourFile.json', 'w') as f:
  json.dump(data, f, indent=4)

代码中的for循环将您的节点ID转换为数字。这非常重要,因为JSON最终文件中的源和目标已经是数字(而不是字符)。


3

1

-1

好的,我终于找到了一些方法将图形转换为符合d3.js的.json格式http://coulmont.com/blog/2012/11/03/reseau-d3js/。这是通过R和RJSONIO库完成的(注释为法语)。

library(RJSONIO) 
#creation de la partie qui renseigne les "nodes"
temp<-cbind(V(g2)$name,V(g2)$group)
colnames(temp)<-c("name","group")
js1<-toJSON(temp)
#creation de la partie qui renseigne les "liens"
write.graph(g2,"Desktop/edgelist.csv",format="edgelist")
edges<-read.csv("Desktop/edgelist.csv",sep=" ",header=F)
colnames(edges)<-c("source","target")
edges<-as.matrix(edges)
js2<-toJSON(edges)
#concatenation des deux parties
reseau<-paste('{"nodes":',js1,',"links":',js2,'}',sep="")
write(reseau,file="Desktop/reseau.json")

请尝试使用clickme,这是一个使用R输入数据生成JS可视化的R软件包 http://bit.ly/rclickme - nachocab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接