Skip to content

Commit 533d512

Browse files
committed
Add "Visualizing Betweenness" tutorial
Documents how to visualize both vertex and edge betweenness
1 parent 9ea92c3 commit 533d512

4 files changed

Lines changed: 104 additions & 0 deletions

File tree

doc/source/gallery.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Gallery
99
This page contains short examples showcasing the functionality of |igraph|:
1010

1111
- :ref:`tutorials-quickstart`
12+
- :ref:`tutorials-betweenness`
1213
- :ref:`tutorials-bipartite-matching`
1314
- :ref:`tutorials-bipartite-matching-maxflow`
1415
- :ref:`tutorials-random`
@@ -25,6 +26,7 @@ This page contains short examples showcasing the functionality of |igraph|:
2526
:hidden:
2627

2728
tutorials/quickstart/quickstart
29+
tutorials/betweenness/betweenness
2830
tutorials/bipartite_matching/bipartite_matching
2931
tutorials/bipartite_matching_maxflow/bipartite_matching_maxflow
3032
tutorials/erdos_renyi/erdos_renyi
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import igraph as ig
2+
import matplotlib.pyplot as plt
3+
import math
4+
import random
5+
6+
# Generate graph
7+
random.seed(1)
8+
g = ig.Graph.Barabasi(n=200, m=2)
9+
10+
# Calculate vertex betweenness and scale it to be between 0.0 and 1.0
11+
vertex_betweenness = g.betweenness()
12+
vertex_betweenness = [math.pow(i, 1/3) for i in vertex_betweenness] # scale values so transition is smoother
13+
min_vertex_betweenness = min(vertex_betweenness)
14+
max_vertex_betweenness = max(vertex_betweenness)
15+
vertex_betweenness = [(i - min_vertex_betweenness) / (max_vertex_betweenness - min_vertex_betweenness) for i in vertex_betweenness]
16+
17+
# Calculate edge betweenness and scale it to be between 0.0 and 1.0
18+
edge_betweenness = g.edge_betweenness()
19+
edge_betweenness = [math.pow(i, 1/2) for i in edge_betweenness] # scale values so transition is smoother
20+
min_edge_betweenness = min(edge_betweenness)
21+
max_edge_betweenness = max(edge_betweenness)
22+
edge_betweenness = [(i - min_edge_betweenness) / (max_edge_betweenness - min_edge_betweenness) for i in edge_betweenness]
23+
24+
# Plot the graph
25+
fig, ax = plt.subplots()
26+
ig.plot(
27+
g,
28+
target=ax,
29+
layout="fruchterman_reingold",
30+
palette=ig.GradientPalette("white", "midnightblue"),
31+
vertex_color=[int(betweenness * 255) for betweenness in vertex_betweenness], # colors are integers between 0 and 255
32+
edge_color=[int(betweenness * 255) for betweenness in edge_betweenness],
33+
vertex_size=[betweenness*0.5+0.1 for betweenness in vertex_betweenness], # vertex_size is between 0.1 and 0.6
34+
edge_width=[betweenness*0.5+0.5 for betweenness in edge_betweenness], # edge_width is between 0.5 and 1
35+
vertex_frame_width=0.2,
36+
)
37+
plt.show()
38+
39+
# fig.savefig("../figures/betweenness.png", dpi=200)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
.. include:: ../../include/global.rst
2+
3+
.. _tutorials-betweenness:
4+
5+
=======================
6+
Visualizing Betweenness
7+
=======================
8+
9+
.. _betweenness: https://igraph.org/python/doc/api/igraph._igraph.GraphBase.html#betweenness
10+
.. |betweenness| replace:: :meth:`betweenness`
11+
.. _edge_betweenness: https://igraph.org/python/doc/api/igraph._igraph.GraphBase.html#edge_betweenness
12+
.. |edge_betweenness| replace:: :meth:`edge_betweenness`
13+
14+
This example will demonstrate how to visualize both vertex and edge betweenness with a custom defined color palette. We use the methods |betweenness|_ and |edge_betweenness|_ respectively.
15+
16+
.. code-block:: python
17+
18+
import igraph as ig
19+
import matplotlib.pyplot as plt
20+
import math
21+
import random
22+
23+
# Generate graph
24+
random.seed(1)
25+
g = ig.Graph.Barabasi(n=200, m=2)
26+
27+
# Calculate vertex betweenness and scale it to be between 0.0 and 1.0
28+
vertex_betweenness = g.betweenness()
29+
vertex_betweenness = [math.pow(i, 1/3) for i in vertex_betweenness]
30+
min_vertex_betweenness = min(vertex_betweenness)
31+
max_vertex_betweenness = max(vertex_betweenness)
32+
vertex_betweenness = [(i - min_vertex_betweenness) / (max_vertex_betweenness - min_vertex_betweenness) for i in vertex_betweenness]
33+
34+
# Calculate edge betweenness and scale it to be between 0.0 and 1.0
35+
edge_betweenness = g.edge_betweenness()
36+
edge_betweenness = [math.pow(i, 1/2) for i in edge_betweenness]
37+
min_edge_betweenness = min(edge_betweenness)
38+
max_edge_betweenness = max(edge_betweenness)
39+
edge_betweenness = [(i - min_edge_betweenness) / (max_edge_betweenness - min_edge_betweenness) for i in edge_betweenness]
40+
41+
# Plot the graph
42+
fig, ax = plt.subplots()
43+
ig.plot(
44+
g,
45+
target=ax,
46+
layout="fruchterman_reingold",
47+
palette=ig.GradientPalette("white", "midnightblue"), # define a new color palette
48+
vertex_color=[int(betweenness * 255) for betweenness in vertex_betweenness], # colors are integers between 0 and 255
49+
edge_color=[int(betweenness * 255) for betweenness in edge_betweenness],
50+
vertex_size=[betweenness*0.5+0.1 for betweenness in vertex_betweenness], # vertex_size is between 0.1 and 0.6
51+
edge_width=[betweenness*0.5+0.5 for betweenness in edge_betweenness], # edge_width is between 0.5 and 1
52+
vertex_frame_width=0.2,
53+
)
54+
plt.show()
55+
56+
Note that we scale the betweennesses for the vertices and edges by the cube root and square root respectively. The choice of scaling is arbitrary, but is used to give a smoother, more linear transition in the sizes and colors of nodes and edges. The final output graph is here:
57+
58+
.. figure:: ./figures/betweenness.png
59+
:alt: A graph visualizing the betweenness of each vertex and edge.
60+
:align: center
61+
62+
A graph visualizing edge betweenness. White indicates a low betweenness centrality, whereas dark blue indicates a high betweenness centrality.
63+
371 KB
Loading

0 commit comments

Comments
 (0)