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