networkx 2.8.2 Pypi GitHub Homepage
Other Docs
ParametersBackRef

Multiedges are multiple edges between two nodes. Each edge can hold optional data or attributes.

A MultiGraph holds undirected edges. Self loops are allowed.

Nodes can be arbitrary (hashable) Python objects with optional key/value attributes. By convention :None:None:`None` is not used as a node.

Edges are represented as links between nodes with optional key/value attributes, in a MultiGraph each edge has a key to distinguish between multiple edges that have the same source and destination nodes.

Parameters

incoming_graph_data : input graph (optional, default: None)

Data to initialize graph. If None (default) an empty graph is created. The data can be any format that is supported by the to_networkx_graph() function, currently including edge list, dict of dicts, dict of lists, NetworkX graph, 2D NumPy array, SciPy sparse matrix, or PyGraphviz graph.

multigraph_input : bool or None (default None)

Note: Only used when :None:None:`incoming_graph_data` is a dict. If True, :None:None:`incoming_graph_data` is assumed to be a dict-of-dict-of-dict-of-dict structure keyed by node to neighbor to edge keys to edge data for multi-edges. A NetworkXError is raised if this is not the case. If False, to_networkx_graph is used to try to determine the dict's graph data structure as either a dict-of-dict-of-dict keyed by node to neighbor to edge data, or a dict-of-iterable keyed by node to neighbors. If None, the treatment for True is tried, but if it fails, the treatment for False is tried.

attr : keyword arguments, optional (default= no attributes)

Attributes to add to graph as key=value pairs.

An undirected graph class that can store multiedges.

See Also

DiGraph
Graph
MultiDiGraph
OrderedMultiGraph

Examples

Create an empty graph structure (a "null graph") with no nodes and no edges.

>>> G = nx.MultiGraph()

G can be grown in several ways.

Nodes:

Add one node at a time:

>>> G.add_node(1)

Add the nodes from any container (a list, dict, set or even the lines from a file or the nodes from another graph).

>>> G.add_nodes_from([2, 3])
... G.add_nodes_from(range(100, 110))
... H = nx.path_graph(10)
... G.add_nodes_from(H)

In addition to strings and integers any hashable Python object (except None) can represent a node, e.g. a customized node object, or even another Graph.

>>> G.add_node(H)

Edges:

G can also be grown by adding edges.

Add one edge,

>>> key = G.add_edge(1, 2)

a list of edges,

>>> keys = G.add_edges_from([(1, 2), (1, 3)])

or a collection of edges,

>>> keys = G.add_edges_from(H.edges)

If some edges connect nodes not yet in the graph, the nodes are added automatically. If an edge already exists, an additional edge is created and stored using a key to identify the edge. By default the key is the lowest unused integer.

>>> keys = G.add_edges_from([(4, 5, {"route": 28}), (4, 5, {"route": 37})])
... G[4] AdjacencyView({3: {0: {}}, 5: {0: {}, 1: {'route': 28}, 2: {'route': 37}}})

Attributes:

Each graph, node, and edge can hold key/value attribute pairs in an associated attribute dictionary (the keys must be hashable). By default these are empty, but can be added or changed using add_edge, add_node or direct manipulation of the attribute dictionaries named graph, node and edge respectively.

>>> G = nx.MultiGraph(day="Friday")
... G.graph {'day': 'Friday'}

Add node attributes using add_node(), add_nodes_from() or G.nodes

>>> G.add_node(1, time="5pm")
... G.add_nodes_from([3], time="2pm")
... G.nodes[1] {'time': '5pm'}
>>> G.nodes[1]["room"] = 714
... del G.nodes[1]["room"] # remove attribute
... list(G.nodes(data=True)) [(1, {'time': '5pm'}), (3, {'time': '2pm'})]

Add edge attributes using add_edge(), add_edges_from(), subscript notation, or G.edges.

>>> key = G.add_edge(1, 2, weight=4.7)
... keys = G.add_edges_from([(3, 4), (4, 5)], color="red")
... keys = G.add_edges_from([(1, 2, {"color": "blue"}), (2, 3, {"weight": 8})])
... G[1][2][0]["weight"] = 4.7
... G.edges[1, 2, 0]["weight"] = 4

Warning: we protect the graph data structure by making :None:None:`G.edges[1, 2, 0]` a read-only dict-like structure. However, you can assign to attributes in e.g. :None:None:`G.edges[1, 2, 0]`. Thus, use 2 sets of brackets to add/change data attributes: :None:None:`G.edges[1, 2, 0]['weight'] = 4`.

Shortcuts:

Many common graph features allow python syntax to speed reporting.

>>> 1 in G  # check if node in graph
True
>>> [n for n in G if n < 3]  # iterate through nodes
[1, 2]
>>> len(G)  # number of nodes in graph
5
>>> G[1]  # adjacency dict-like view mapping neighbor -> edge key -> edge attributes
AdjacencyView({2: {0: {'weight': 4}, 1: {'color': 'blue'}}})

Often the best way to traverse all edges of a graph is via the neighbors. The neighbors are reported as an adjacency-dict :None:None:`G.adj` or :None:None:`G.adjacency()`.

>>> for n, nbrsdict in G.adjacency():
...  for nbr, keydict in nbrsdict.items():
...  for key, eattr in keydict.items():
...  if "weight" in eattr:
...  # Do something useful with the edges
...  pass

But the edges() method is often more convenient:

>>> for u, v, keys, weight in G.edges(data="weight", keys=True):
...  if weight is not None:
...  # Do something useful with the edges
...  pass

Reporting:

Simple graph information is obtained using methods and object-attributes. Reporting usually provides views instead of containers to reduce memory usage. The views update as the graph is updated similarly to dict-views. The objects nodes , edges and :None:None:`adj` provide access to data attributes via lookup (e.g. :None:None:`nodes[n]`, :None:None:`edges[u, v, k]`, :None:None:`adj[u][v]`) and iteration (e.g. :None:None:`nodes.items()`, :None:None:`nodes.data('color')`, :None:None:`nodes.data('color', default='blue')` and similarly for edges ) Views exist for nodes , edges , :None:None:`neighbors()`/:None:None:`adj` and degree .

For details on these and other miscellaneous methods, see below.

Subclasses (Advanced):

The MultiGraph class uses a dict-of-dict-of-dict-of-dict data structure. The outer dict (node_dict) holds adjacency information keyed by node. The next dict (adjlist_dict) represents the adjacency information and holds edge_key dicts keyed by neighbor. The edge_key dict holds each edge_attr dict keyed by edge key. The inner dict (edge_attr_dict) represents the edge data and holds edge attribute values keyed by attribute names.

Each of these four dicts in the dict-of-dict-of-dict-of-dict structure can be replaced by a user defined dict-like object. In general, the dict-like features should be maintained but extra features can be added. To replace one of the dicts create a new graph class by changing the class(!) variable holding the factory for that dict-like structure. The variable names are node_dict_factory, node_attr_dict_factory, adjlist_inner_dict_factory, adjlist_outer_dict_factory, edge_key_dict_factory, edge_attr_dict_factory and graph_attr_dict_factory.

node_dict_factory

node_dict_factory

node_attr_dict_factory: function, (default: dict)

Factory function to be used to create the node attribute dict which holds attribute values keyed by attribute name. It should require no arguments and return a dict-like object

adjlist_outer_dict_factory

adjlist_outer_dict_factory

adjlist_inner_dict_factory

adjlist_inner_dict_factory

edge_key_dict_factory

edge_key_dict_factory

edge_attr_dict_factory

edge_attr_dict_factory

graph_attr_dict_factory

graph_attr_dict_factory

Typically, if your extension doesn't impact the data structure all methods will inherited without issue except: :None:None:`to_directed/to_undirected`. By default these methods create a DiGraph/Graph class and you probably want them to create your extension of a DiGraph/Graph. To facilitate this we define two class variables that you can set in your subclass.

to_directed_class

to_directed_class

to_undirected_class

to_undirected_class

Please see ~networkx.classes.ordered for examples of creating graph subclasses by overwriting the base class :None:None:`dict` with a dictionary-like object.

See :

Back References

The following pages refer to to this document either explicitly or contain code examples using this.

networkx

31 Elements
networkx.convert_matrix.from_numpy_matrix
networkx.classes.digraph.DiGraph
networkx.algorithms.traversal.edgedfs.edge_dfs
networkx.classes.multigraph.MultiGraph.__init__
networkx.relabel.relabel_nodes
networkx.convert.to_dict_of_dicts
networkx.classes.multigraph.MultiGraph.to_directed
networkx.classes.multigraph.MultiGraph.remove_edge
networkx.convert_matrix.from_scipy_sparse_matrix
networkx.algorithms.tree.decomposition.junction_tree
networkx.classes.graph.Graph
networkx.classes.multigraph.MultiGraph.add_edge
networkx.readwrite.json_graph.cytoscape.cytoscape_graph
networkx.convert_matrix.to_pandas_edgelist
networkx.classes.multigraph.MultiGraph.has_edge
networkx.convert_matrix.from_scipy_sparse_array
networkx.algorithms.minors.contraction.contracted_nodes
networkx.generators.degree_seq.configuration_model
networkx.classes.reportviews.EdgeView
networkx.algorithms.bipartite.projection.projected_graph
networkx.convert_matrix.from_pandas_edgelist
networkx.readwrite.pajek.read_pajek
networkx.convert_matrix.from_numpy_array
networkx.algorithms.traversal.edgebfs.edge_bfs
networkx.classes.function.selfloop_edges
networkx.classes.multigraph.MultiGraph.to_undirected
networkx.classes.multidigraph.MultiDiGraph
networkx.classes.multigraph.MultiGraph.get_edge_data
networkx.classes.multidigraph.MultiDiGraph.to_undirected
networkx.classes.multigraph.MultiGraph
networkx.classes.multigraph.MultiGraph.remove_edges_from

Local connectivity graph

Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.

Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)

SVG is more flexible but power hungry; and does not scale well to 50 + nodes.

All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them


GitHub : /networkx/classes/multigraph.py#15
type: <class 'type'>
Commit: