# Force-directed graphs in Lightning

## Setup

In :
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


## Connect to server¶

In :
lgn = Lightning(ipython=True, host='http://public.lightning-viz.org') Lightning initialized
Connected to server at 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 :
n = 100
G = nx.random_regular_graph(3,n)
lgn.force(mat)

Out:

## 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 :
G = nx.random_regular_graph(3,100)
mat = asarray(nx.adjacency_matrix(G).todense()) * (((random.rand(100,100))*5) ** 2)
lgn.force(mat)

Out:

## 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 :
G = nx.random_lobster(60, 0.5, 0.0, seed=44)
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:

## 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 :
G = nx.random_geometric_graph(50, 0.1)
g = G.degree().values()
lgn.force(mat, group=g, size=(asarray(g) + 1.5)*3)

Out:

## 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 :
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: