Creating CX2Network objects
Below are factories that facilitate creation of CX2Network
objects in different ways:
Raw CX2
The RawCX2NetworkFactory
is designed to create a
CX2Network
instance directly from raw CX2 data.
from ndex2.cx2 import RawCX2NetworkFactory, CX2Network
# Sample raw CX2 data
raw_cx2_data = {...} # Replace with actual raw CX2 data
# Creating an instance of RawCX2NetworkFactory
factory = RawCX2NetworkFactory()
# Creating a CX2Network from raw CX2 data
cx2_network = factory.get_cx2network(raw_cx2_data)
# cx2_network is now a populated CX2Network instance
NetworkX
The NetworkXToCX2NetworkFactory
facilitates the conversion of a NetworkX graph
into a CX2Network
. This allows you to leverage the CX2 format for sharing, storing, or processing
networks in Cytoscape Ecosystem.
Features:
Converts nodes, edges, and their attributes from a NetworkX graph to a CX2Network.
Supports layout extraction from node attributes (x, y, z) or external position dictionaries (G.pos and G.zpos).
Handles edge attributes, network-level attributes, and node-level attributes.
Automatically assigns unique IDs to nodes when non-integer IDs are used.
Layout storage settings:
If get_layout_from_pos=True, layout coordinates are extracted from G.pos and G.zpos.
G.pos: A dictionary mapping node IDs to (x, y) tuples
G.zpos: A dictionary mapping node IDs to z-coordinates.
If get_layout_from_pos=False, layout coordinates are extracted from node attributes (x, y, z) if they exist.
Warning
If the Networkx graph contains string node IDs that cannot be converted to integers, the node IDs will be saved
in the name
attribute. If the graph already has a name attribute for its nodes, this may result in a conflict
and loss of information. To avoid this, please rename the existing name attribute before saving the graph.
import networkx as nx
from ndex2.cx2 import NetworkXToCX2NetworkFactory, CX2Network
# Create and populate a NetworkX graph
networkx_graph = nx.MultiDiGraph()
networkx_graph.add_node(1, name='Node1', size=5)
networkx_graph.add_node(2, name='Node2', size=10)
networkx_graph.add_edge(1, 2, weight=1.0, interaction='activates')
# Add layout positions to the graph
networkx_graph.pos = {1: (10.0, 20.0), 2: (15.0, 25.0)}
networkx_graph.zpos = {1: 5.0, 2: 7.0}
# Convert to CX2Network using the factory
factory = NetworkXToCX2NetworkFactory()
cx2_network = factory.get_cx2network(networkx_graph, get_layout_from_pos=True)
# View the CX2Network data
print(cx2_network.to_cx2())
Pandas
The PandasDataFrameToCX2NetworkFactory
facilitates the conversion of
a pandas.DataFrame
into a CX2Network
. This is particularly useful for integrating
tabular data into the CX2 network structure for visualization, analysis, and sharing in Cytoscape Ecosystem.
Features
Customizable Input: Supports defining custom source and target node fields and node and edge attributes via prefixes or explicit column lists.
Flexible Layout Handling: Automatically detects and uses node layout attributes (x, y, z) when present.
Edge Interactions: Supports custom interaction column name (interaction_col parameter). Default edge interaction type can be set using the edge_interaction parameter.
Default Behavior: If no custom edge attributes are provided, all non-node attribute columns are treated as edge attributes.
Node Attribute Updates: Nodes listed multiple times will have their attributes updated based on the latest occurrence in the DataFrame.
Example 1 (setting node ids)
import pandas as pd
from ndex2.cx2 import PandasDataFrameToCX2NetworkFactory, CX2Network
# DataFrame with source, target, and other columns
data = {'source': [1, 2], 'target': [2, 3],
'weight': [1.0, 0.9],
'source_size': [5, 6], 'target_size': [6, 7]}
df = pd.DataFrame(data)
# Creating an instance of PandasDataFrameToCX2NetworkFactory
factory = PandasDataFrameToCX2NetworkFactory()
# Converting DataFrame to CX2Network
cx2_network = factory.get_cx2network(df, source_id='source', target_id='target')
# cx2_network is now a CX2Network instance based on the DataFrame data
print(cx2_network.to_cx2())
Example 2 (using node names)
import pandas as pd
from ndex2.cx2 import PandasDataFrameToCX2NetworkFactory, CX2Network
# DataFrame with source, target, and other columns
data = {'source': ['A', 'B'], 'target': ['B', 'C'],
'weight': [1.0, 0.9],
'source_size': [5, 6], 'target_size': [6, 7]}
df = pd.DataFrame(data)
# Creating an instance of PandasDataFrameToCX2NetworkFactory
factory = PandasDataFrameToCX2NetworkFactory()
# Converting DataFrame to CX2Network
cx2_network = factory.get_cx2network(df, source_field='source', target_field='target')
# cx2_network is now a CX2Network instance based on the DataFrame data
print(cx2_network.to_cx2())
Warning
Use source_field
and target_field
when you use node names (e.g. gene symbols, proteins etc.),
use source_id
and target_id
when you want to set specific node IDs (numerical values). It is possible
to use both.
Column Naming Convention
- Source and target nodes of an edge.
By default, the columns
source_name
andtarget_name
represent the names of the source and target nodes, respectively andsource_id
andtarget_id
represent the unique identifiers for the source and target nodes.It can be changed by setting the parameter
source_field
andtarget_field
to column names containing source/ target names, andsource_id
andtarget_id
to column names containing source/target ids. Specifying ids is not necessary.
- Node attributes.
- Node attributes can be specified with a prefix according to their node type:
Use the parameter source_node_attr_prefix to set prefix for attributes of the source node (default
source_
, e.g.,source_color
, the node will have attributecolor
).Use the parameter target_node_attr_prefix to set prefix for attributes of the target node (default
target_
e.g.,target_size
, the node will have attributesize
).
If the prefixes are used, attributes in the form
prefix_x
(e.g.source_x
) will be used as x, y, and z coordinates of the nodeThey can also be explicitly specified as a list passed in parameter
source_node_attr
for edge source node andtarget_node_attr
for edge target node. The same columns can be used for both source and target node attributes (e.g.source_node_attr=['color', 'size']
andtarget_node_attr=['color', 'size']
).
- Edge attributes.
Edge attributes can be specified as list in parameter
edge_attr
. In case the parameter is not set, all columns that were not used as node attributes will be used (e.g.,weight
for an edge’s weight attribute).The
edge_interaction
parameter defines the default interaction type for edges. If not specified in the data frame as edge attribute, this default value is used. If not set, the default interaction is set tointeracts-with
.
Example with column names passed as parameters
import pandas as pd
from ndex2.cx2 import PandasDataFrameToCX2NetworkFactory
# DataFrame with custom column names for nodes and attributes
data = {'Protein 1': ['NodeA', 'NodeB'], 'Protein 2': ['NodeB', 'NodeC'],
'node_id1': [100, 200], 'node_id2': [200, 300], 'connection_strength': [0.8, 0.7],
'color': ['red', 'red'], 's_size': [1, 2], 't_size': [2, 1]}
df = pd.DataFrame(data)
# Creating an instance of PandasDataFrameToCX2NetworkFactory
factory = PandasDataFrameToCX2NetworkFactory()
# Creating CX2Network with custom parameters
cx2_network_custom = factory.get_cx2network(df,
source_field='Protein 1', target_field='Protein 2',
source_id='node_id1', target_id='node_id2',
source_node_attr=['color', 's_size'], target_node_attr=['color', 't_size'],
edge_interaction='binds-to')
# cx2_network_custom is now a CX2Network instance with custom settings
print(cx2_network_custom.to_cx2())
Warning
Please note that if a node is listed both as a source and a target, or appears multiple times either as a source or a target, its attributes will be updated to reflect the most recent data entry in the dataframe. This means that each node’s attributes will correspond to their latest occurrence in the dataset.
For example, if node ‘A’ appears in row 1 with the attribute color=red
, and then appears again in row 5
of the dataframe with the attribute color=blue
, the attribute color of this node will be updated to blue.