## Part 1 – Networkx Basics

`networkx`

is a powerful python package that allows you to easily work with graphs in Python. Combining it with the `matplotlib.pyplot`

package even makes it simple to draw graphs. This is very useful when learning or teaching about **graphs for A Level Computer Science.**

```
# Auto formatting - completely optional, requires installation.
%load_ext nb_black
```

### Setup

```
import networkx as nx
G = nx.Graph()
print(G.nodes(), G.edges())
```

```
[] []
```

### Nodes

```
G.add_node("A")
print(G.nodes())
```

```
['A']
```

```
G.add_nodes_from(["B", "C"])
print(G.nodes())
print("Number of nodes in graph: ", G.number_of_nodes())
```

```
['A', 'B', 'C']
Number of nodes in graph: 3
```

### Edges

OK so now let’s look at how we add edges to our graph.

```
G.clear() # First we clear the graph so we can start fresh
G.add_nodes_from(["A", "B", "C"])
G.add_edge("A", "B", weight=5)
G.add_edge("B", "C", weight=7)
G.add_edge("C", "A", weight=2)
print(G.nodes(), G.edges())
```

```
['A', 'B', 'C'] [('A', 'B'), ('A', 'C'), ('B', 'C')]
```

### The Fun Part – Drawing Your Graph

Now we get to draw our graph. They say a picture is worth a thousand words and I agree. Python makes this super easy for us with just a couple of lines of code.

```
%matplotlib inline
import matplotlib.pyplot as plt
pos = nx.spring_layout(G)
weights = nx.get_edge_attributes(G, "weight")
nx.draw_networkx(G, pos, with_labels=True)
nx.draw_networkx_edge_labels(G, pos, edge_labels=weights)
plt.title("Basic Graphs with Networkx")
plt.gcf().canvas.set_window_title("")
plt.show()
```

I for one am pretty impressed by the `networkx`

package. This article covers just the very basics, but already we have drawn a weighted graphs and learned how to add nodes and edges to an existing graph using `networkx`

‘s powerful functionality.

Here’s the complete listing for this example, for your convenience:

```
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
G = nx.Graph() # Create empty graph
G.add_nodes_from(["A", "B", "C"]) # Add nodes
# Add edges
G.add_edge("A", "B", weight=5)
G.add_edge("B", "C", weight=7)
G.add_edge("C", "A", weight=2)
# Create drawing
pos = nx.spring_layout(G) # List of positions of nodes
weights = nx.get_edge_attributes(G, "weight") # List of weights
nx.draw_networkx(G, pos, with_labels=True)
nx.draw_networkx_edge_labels(G, pos, edge_labels=weights)
plt.title("Basic Graphs with Networkx")
plt.gcf().canvas.set_window_title("") # Hide window title
# Display Graph
plt.show()
```