| 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 | |
| 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 | |