Converting CX2Network objects to other formats
Below are converters that facilitate conversion of
CX2Network
object to other types
(such as NetworkX or Pandas)
Networkx
The CX2NetworkXFactory
is a utility class for converting a CX2Network
into
a networkx.Graph
. This allows you to seamlessly leverage NetworkX for analysis, visualization, and
manipulation of CX2Network data.
Features:
Converts nodes, edges, and their attributes from a CX2Network to a NetworkX graph.
Supports multiple types of NetworkX graphs (e.g.,
networkx.MultiDiGraph
,networkx.DiGraph
).Includes layout information (e.g., x, y, z coordinates) either as node attributes or in G.pos and G.zpos (when store_layout_in_pos attribute set to True).
Retains network-level attributes as graph-level attributes.
Warning
If a CX2Network includes x, y, or z as node attributes and the store_layout_in_pos attribute is not set, these attributes will be overwritten by the layout coordinates (x, y, z), resulting in the loss of the original values. To prevent this, it is recommended to either rename the x, y, or z attributes or store the layout coordinates in G.pos and G.zpos instead.
import networkx as nx
from ndex2.cx2 import CX2NetworkXFactory, CX2Network
cx2_network = CX2Network()
# Populate cx2_network...
# setting node_id to 4 to show ids of networkx nodes will match internal ids of
# nodes in CX2Network
node_one_id = cx2_network.add_node(node_id=4, attributes={'name': 'node 1', 'age': 5}, x=10, y=20)
node_two_id = cx2_network.add_node(attributes={'name': 'node 2', 'age': 10}, x=15, y=30)
cx2_network.add_edge(source=node_one_id, target=node_two_id, attributes={'weight': 0.3})
# Creating an instance of CX2NetworkXFactory
factory = CX2NetworkXFactory()
# Creating a NetworkX graph from CX2Network (store_layout_in_pos is False by default)
networkx_graph = factory.get_graph(cx2_network)
# networkx_graph is now a NetworkX graph populated with data from cx2_network
print(networkx_graph.nodes(data=True))
# Convert CX2Network to NetworkX graph with layout stored in G.pos
networkx_graph_with_pos = factory.get_graph(cx2_network, store_layout_in_pos=True)
# Display layout positions
print("Positions:", networkx_graph_with_pos.pos)
print("Z Positions:", networkx_graph_with_pos.zpos)
Note
- Node IDs:
NetworkX node IDs correspond to the internal node IDs in the CX2Network.
- Coordinate Handling:
Node coordinates will be added as attributes named
x
,y
,z
if store_layout_in_pos is not set. If store_layout_in_pos, coordinates will be stored in G.pos (x and y) and G.zpos (z). Y-coordinates are inverted when stored in G.pos.
- Default Graph Type:
The factory creates a
networkx.MultiDiGraph
by default. You can provide your own empty graph of any type using the networkx_graph parameter.
Pandas
The CX2NetworkPandasDataFrameFactory
allows for the conversion of a
CX2Network
into a Pandas pandas.DataFrame
. This provides flexibility for analyzing,
visualizing, and manipulating network data using Pandas.
Features:
Converts the network into an edge list table with source and target node details.
Includes edge and node attributes, prefixed with source_ and target_ for clarity.
Adds node layout coordinates (x, y, z) if available.
Optionally generates a node list table containing detailed node attributes.
import pandas as pd
from ndex2.cx2 import CX2NetworkPandasDataFrameFactory, CX2Network
cx2_network = CX2Network()
# Populate cx2_network...
node_one_id = cx2_network.add_node(attributes={'name': 'node 1', 'age': 5}, x=10, y=20)
node_two_id = cx2_network.add_node(attributes={'name': 'node 2', 'age': 10}, x=15, y=30)
cx2_network.add_edge(source=node_one_id, target=node_two_id, attributes={'weight': 0.3})
# Creating an instance of CX2NetworkPandasDataFrameFactory
factory = CX2NetworkPandasDataFrameFactory()
# Converting CX2Network to DataFrame
df = factory.get_dataframe(cx2_network)
# df is now a DataFrame representing the CX2Network data
print(df)
# Generate a node list table from CX2Network
node_list_df = factory.get_nodelist_table(cx2_network)
# Display the node list DataFrame
print(node_list_df)
Note
At a minimum there will be two columns source_id
and target_id
which contain
the internal ids of the source and target nodes for a given edge.
Node attributes will be put into columns with their attribute names prefixed with source_
and target_