Force-directed graphs in Lightning

Setup

In [1]:

```
import os
from lightning import Lightning
from numpy import random, asarray, linspace, corrcoef
from colorsys import hsv_to_rgb
from sklearn import datasets
import networkx as nx
```

In [2]:

```
lgn = Lightning(ipython=True, host='http://public.lightning-viz.org')
```

Random binary network

A random graph where every node has the same degree, with default styling.

This and other graph plots take matrices (e.g. adjacency matrices) as inputs.

We use the `networkx`

library to generate the graph, then get its adjancency matrix.

Double click on a point to see its neighbors (all should have 3).

Drag points to try and move the graph, it should remain tight because of the degree structure.

In [3]:

```
n = 100
G = nx.random_regular_graph(3,n)
mat = nx.adjacency_matrix(G).todense()
lgn.force(mat)
```

Out[3]:

Random weighted network

The previous network was binary (all links either 0 or 1). Here the links are weighted, which is reflected in the line widths.

In [4]:

```
G = nx.random_regular_graph(3,100)
mat = asarray(nx.adjacency_matrix(G).todense()) * (((random.rand(100,100))*5) ** 2)
lgn.force(mat)
```

Out[4]:

Lobster network

The lobster graph, a backbone with some leaves, is colored here by node ordering.

We also set all nodes with degree less than 2 to gray.

In [5]:

```
G = nx.random_lobster(60, 0.5, 0.0, seed=44)
mat = nx.adjacency_matrix(G).todense()
n = len(G.nodes())
c = [list(asarray(hsv_to_rgb(float(x) / n , 0.8, 1.0))*255) if y > 1 else [150,150,150] for (x,y) in G.degree_iter()]
lgn.force(mat, color=c)
```

Out[5]:

Coloring by degree

Here we color points (and also change their size) to indicate their degree.

Click to confirm bigger points have more connections.

In [6]:

```
G = nx.random_geometric_graph(50, 0.1)
mat = nx.adjacency_matrix(G).todense()
g = G.degree().values()
lgn.force(mat, group=g, size=(asarray(g) + 1.5)*3)
```

Out[6]:

Graph of clustering

Graphs can be a useful way to look at data that doesn't neccessarily come from a graph.

Here we create a graph from a thresholded correlation matrix on data drawn from a set of clusters.

The cluster identities are clear in the resulting graph.

In [7]:

```
d, g = datasets.make_blobs(n_features=5, n_samples=50, centers=5, cluster_std=2.0, random_state=100)
c = corrcoef(d)
c[c<0.9] = 0
lgn.force(c, group=g)
```

Out[7]: