Как преобразовать точечный граф в граф JSON?
Я хочу использовать sigma.js, чтобы показать график DOT. Но похоже, что sigma.js поддерживает только формат графов json.
Существуют ли какие-либо инструменты bash или модуль javascript, позволяющий преобразовать граф DOT в граф json?
Например из графика DOT:
graph {
n1 [Label = "n1"];
n2 [Label = "n2"];
n3 [Label = "n3"];
n1 -- n2;
n1 -- n3;
n2 -- n2;
}
Перейдите в граф JSON:
{
"nodes": [
{
"id": "n0",
"label": "A node",
"x": 0,
"y": 0,
"size": 3
},
{
"id": "n1",
"label": "Another node",
"x": 3,
"y": 1,
"size": 2
},
{
"id": "n2",
"label": "And a last one",
"x": 1,
"y": 3,
"size": 1
}
],
"edges": [
{
"id": "e0",
"source": "n0",
"target": "n1"
},
{
"id": "e1",
"source": "n1",
"target": "n2"
},
{
"id": "e2",
"source": "n2",
"target": "n0"
}
]
}
3 ответа
dot -Txdot_json -ogrpaph.json graph.dot
Если вы можете использовать python и установить 2 пакета ( networkx и pygraphviz), вот короткий скрипт для преобразования точечного графа в граф json:
# dot_to_json_graph.py
# http://stackru.com/questions/40262441/how-to-transform-a-dot-graph-to-json-graph
# Packages needed :
# sudo aptitude install python-networkx python-pygraphviz
#
# Syntax :
# python dot_to_json_graph.py graph.dot
import networkx as nx
from networkx.readwrite import json_graph
import sys
if len(sys.argv)==1:
sys.stderr.write("Syntax : python %s dot_file\n" % sys.argv[0])
else:
dot_graph = nx.read_dot(sys.argv[1])
print json_graph.dumps(dot_graph)
Вот ваш пример, преобразованный в граф JSON:
{"directed": false, "graph": [["node", {"Label": ""}], ["graph", {"file": "test.dot"}], ["edge", {}], ["name", ""]], "node": [{"id": "n1", "Label": "n1"}, {"id": "n2", "Label": "n2"}, {"id": "n3", "Label": "n3"}], "links": [{"source": 0, "target": 1, "key": 0}, {"source": 0, "target": 2, "key": 0}, {"source": 1, "target": 1, "key": 0}], "multigraph": true}
Я не смог установить pygraphviz как в Windows, так и в Linux, и я недавно столкнулся с той же проблемой.NETworkx теперь поддерживает более простой дамп в json, включая форматы d3.js ( информация на этой странице)
Я пришел с двумя обходными путями:
1- Используйте PyDot
Вероятно, скоро устареет! PyDot не может использоваться так часто, потому что у нас есть интерфейс graphviz в python.
def dot_to_json(file_in):
import networkx
from networkx.readwrite import json_graph
import pydot
graph_netx = networkx.drawing.nx_pydot.read_dot(file_in)
graph_json = json_graph.node_link_data( graph_netx )
return json_graph.node_link_data(graph_netx)
2- Используйте Graphviz Source
Как показано в этой части документации по интерфейсу graphviz, вы можете создать график из исходного файла.dot.