|
|
import networkx as nx |
|
|
|
|
|
__all__ = ["cytoscape_data", "cytoscape_graph"] |
|
|
|
|
|
|
|
|
def cytoscape_data(G, name="name", ident="id"): |
|
|
"""Returns data in Cytoscape JSON format (cyjs). |
|
|
|
|
|
Parameters |
|
|
---------- |
|
|
G : NetworkX Graph |
|
|
The graph to convert to cytoscape format |
|
|
name : string |
|
|
A string which is mapped to the 'name' node element in cyjs format. |
|
|
Must not have the same value as `ident`. |
|
|
ident : string |
|
|
A string which is mapped to the 'id' node element in cyjs format. |
|
|
Must not have the same value as `name`. |
|
|
|
|
|
Returns |
|
|
------- |
|
|
data: dict |
|
|
A dictionary with cyjs formatted data. |
|
|
|
|
|
Raises |
|
|
------ |
|
|
NetworkXError |
|
|
If the values for `name` and `ident` are identical. |
|
|
|
|
|
See Also |
|
|
-------- |
|
|
cytoscape_graph: convert a dictionary in cyjs format to a graph |
|
|
|
|
|
References |
|
|
---------- |
|
|
.. [1] Cytoscape user's manual: |
|
|
http://manual.cytoscape.org/en/stable/index.html |
|
|
|
|
|
Examples |
|
|
-------- |
|
|
>>> G = nx.path_graph(2) |
|
|
>>> nx.cytoscape_data(G) # doctest: +SKIP |
|
|
{'data': [], |
|
|
'directed': False, |
|
|
'multigraph': False, |
|
|
'elements': {'nodes': [{'data': {'id': '0', 'value': 0, 'name': '0'}}, |
|
|
{'data': {'id': '1', 'value': 1, 'name': '1'}}], |
|
|
'edges': [{'data': {'source': 0, 'target': 1}}]}} |
|
|
""" |
|
|
if name == ident: |
|
|
raise nx.NetworkXError("name and ident must be different.") |
|
|
|
|
|
jsondata = {"data": list(G.graph.items())} |
|
|
jsondata["directed"] = G.is_directed() |
|
|
jsondata["multigraph"] = G.is_multigraph() |
|
|
jsondata["elements"] = {"nodes": [], "edges": []} |
|
|
nodes = jsondata["elements"]["nodes"] |
|
|
edges = jsondata["elements"]["edges"] |
|
|
|
|
|
for i, j in G.nodes.items(): |
|
|
n = {"data": j.copy()} |
|
|
n["data"]["id"] = j.get(ident) or str(i) |
|
|
n["data"]["value"] = i |
|
|
n["data"]["name"] = j.get(name) or str(i) |
|
|
nodes.append(n) |
|
|
|
|
|
if G.is_multigraph(): |
|
|
for e in G.edges(keys=True): |
|
|
n = {"data": G.adj[e[0]][e[1]][e[2]].copy()} |
|
|
n["data"]["source"] = e[0] |
|
|
n["data"]["target"] = e[1] |
|
|
n["data"]["key"] = e[2] |
|
|
edges.append(n) |
|
|
else: |
|
|
for e in G.edges(): |
|
|
n = {"data": G.adj[e[0]][e[1]].copy()} |
|
|
n["data"]["source"] = e[0] |
|
|
n["data"]["target"] = e[1] |
|
|
edges.append(n) |
|
|
return jsondata |
|
|
|
|
|
|
|
|
@nx._dispatch(graphs=None) |
|
|
def cytoscape_graph(data, name="name", ident="id"): |
|
|
""" |
|
|
Create a NetworkX graph from a dictionary in cytoscape JSON format. |
|
|
|
|
|
Parameters |
|
|
---------- |
|
|
data : dict |
|
|
A dictionary of data conforming to cytoscape JSON format. |
|
|
name : string |
|
|
A string which is mapped to the 'name' node element in cyjs format. |
|
|
Must not have the same value as `ident`. |
|
|
ident : string |
|
|
A string which is mapped to the 'id' node element in cyjs format. |
|
|
Must not have the same value as `name`. |
|
|
|
|
|
Returns |
|
|
------- |
|
|
graph : a NetworkX graph instance |
|
|
The `graph` can be an instance of `Graph`, `DiGraph`, `MultiGraph`, or |
|
|
`MultiDiGraph` depending on the input data. |
|
|
|
|
|
Raises |
|
|
------ |
|
|
NetworkXError |
|
|
If the `name` and `ident` attributes are identical. |
|
|
|
|
|
See Also |
|
|
-------- |
|
|
cytoscape_data: convert a NetworkX graph to a dict in cyjs format |
|
|
|
|
|
References |
|
|
---------- |
|
|
.. [1] Cytoscape user's manual: |
|
|
http://manual.cytoscape.org/en/stable/index.html |
|
|
|
|
|
Examples |
|
|
-------- |
|
|
>>> data_dict = { |
|
|
... 'data': [], |
|
|
... 'directed': False, |
|
|
... 'multigraph': False, |
|
|
... 'elements': {'nodes': [{'data': {'id': '0', 'value': 0, 'name': '0'}}, |
|
|
... {'data': {'id': '1', 'value': 1, 'name': '1'}}], |
|
|
... 'edges': [{'data': {'source': 0, 'target': 1}}]} |
|
|
... } |
|
|
>>> G = nx.cytoscape_graph(data_dict) |
|
|
>>> G.name |
|
|
'' |
|
|
>>> G.nodes() |
|
|
NodeView((0, 1)) |
|
|
>>> G.nodes(data=True)[0] |
|
|
{'id': '0', 'value': 0, 'name': '0'} |
|
|
>>> G.edges(data=True) |
|
|
EdgeDataView([(0, 1, {'source': 0, 'target': 1})]) |
|
|
""" |
|
|
if name == ident: |
|
|
raise nx.NetworkXError("name and ident must be different.") |
|
|
|
|
|
multigraph = data.get("multigraph") |
|
|
directed = data.get("directed") |
|
|
if multigraph: |
|
|
graph = nx.MultiGraph() |
|
|
else: |
|
|
graph = nx.Graph() |
|
|
if directed: |
|
|
graph = graph.to_directed() |
|
|
graph.graph = dict(data.get("data")) |
|
|
for d in data["elements"]["nodes"]: |
|
|
node_data = d["data"].copy() |
|
|
node = d["data"]["value"] |
|
|
|
|
|
if d["data"].get(name): |
|
|
node_data[name] = d["data"].get(name) |
|
|
if d["data"].get(ident): |
|
|
node_data[ident] = d["data"].get(ident) |
|
|
|
|
|
graph.add_node(node) |
|
|
graph.nodes[node].update(node_data) |
|
|
|
|
|
for d in data["elements"]["edges"]: |
|
|
edge_data = d["data"].copy() |
|
|
sour = d["data"]["source"] |
|
|
targ = d["data"]["target"] |
|
|
if multigraph: |
|
|
key = d["data"].get("key", 0) |
|
|
graph.add_edge(sour, targ, key=key) |
|
|
graph.edges[sour, targ, key].update(edge_data) |
|
|
else: |
|
|
graph.add_edge(sour, targ) |
|
|
graph.edges[sour, targ].update(edge_data) |
|
|
return graph |
|
|
|