# coding: utf-8
# #
Graph plots in Lightning
# ##
Setup
# In[1]:
import os
from lightning import Lightning
from numpy import random, asarray, argmin
from colorsys import hsv_to_rgb
import networkx as nx
# ## Connect to server
# In[2]:
lgn = Lightning(ipython=True, host='http://public.lightning-viz.org')
# ##
Random spatial graphs
# Spatial graphs have nodes with fixed spatial positions, and links between them.
#
# They are useful for spatial network data, where position has meaning (unlike force-directed graphs, where position is used dynamically during rendering).
#
# First we'll generate a random geometric graph using `networkx` and plot with basic styling.
#
# The random geometric graph places links between nodes with probability that depends on their spatial distance.
# In[3]:
G = nx.random_geometric_graph(100, 0.2)
pos = asarray(nx.get_node_attributes(G, 'pos').values())
mat = nx.adjacency_matrix(G).todense()
# In[4]:
lgn.graph(pos[:,0], pos[:,1], mat)
# We can add a color to each node. Here we color the same graph based on distance from the origin.
# In[5]:
dists = [(x - 0.5)**2 + (y - 0.5)**2 for x, y in pos]
lgn.graph(pos[:,0], pos[:,1], mat, values=dists, colormap='Greens')
# As with other plots, we can also color using group labels.
#
# Here we assign a label to each point based on the shortest path from it to the center.
# In[6]:
center = argmin(dists)
p = nx.single_source_shortest_path_length(G, center)
xy = asarray([pos[i,:] for i in p.keys()])
g = p.values()
lgn.graph(xy[:,0], xy[:,1], mat, group=g)
# ##
Edge bundling
# Graphs with many edges can become hard to visualize (due to hairballs).
#
# Lightning helps with this by letting you click on points and see only the links to that node. Try it!
# In[7]:
G = nx.random_geometric_graph(50, 0.5)
pos = asarray(nx.get_node_attributes(G, 'pos').values())
dists = [(x - 0.5)**2 + (y - 0.5)**2 for x, y in pos]
mat = nx.adjacency_matrix(G).todense()
# In[8]:
lgn.graph(pos[:,0], pos[:,1], mat)
# Another option is to bundle edges together using an algorithm by Holton and Van Wijk, emphasizing large tracts.
# See this [link](https://github.com/upphiminn/d3.ForceBundle) for the implementaiton.
#
# As with the unbundled version, you can click on points to highlight links.
# In[9]:
lgn.graphbundled(pos[:,0], pos[:,1], mat)