Rubyvis - Example: Matrix Diagrams

A graph can be represented by an adjacency matrix, where each value in row i and column j corresponds to the link from node i to node j. Given this representation, an obvious visualization then is: show the matrix! Using color or saturation instead of text allows patterns to be perceived rapidly. The seriation problem applies just as much to the matrix view as to the arc diagram, so the order of rows and columns is important: here we use a community-detection algorithm to order and color the display.
While path following is harder in a matrix view than in a node-link diagram, matrices have a number of compensating advantages. As networks get large and highly connected, node-link diagrams often devolve into giant hairballs of line crossings. In matrix views, however, line crossings are impossible, and with an effective sorting one quickly can spot clusters and bridges. Allowing interactive grouping and reordering of the matrix facilitates deeper exploration of network structure.
This network represents character co-occurrence in the chapters of Victor Hugo’s classic novel, Les Misérables. Node colors depict cluster memberships computed by a community-detection algorithm. Source: Knuth, D. E. 1993. The Stanford GraphBase: A Platform for Combinatorial Computing, Addison-Wesley.

require 'rubyvis'
load(File.dirname(__FILE__)+"/miserables_data.rb")
color=Rubyvis::Colors.category19


vis = Rubyvis::Panel.new() do 
  width 693
  height 693
  top 90
  left 90
  layout_matrix do
    nodes $miserables.nodes
    links $miserables.links
    sort {|a,b| b.group<=>a.group }
    directed (false)
    link.bar do
      fill_style {|l| l.link_value!=0 ?
       ((l.target_node.group == l.source_node.group) ? color[l.source_node.group] : "#555") : "#eee"}
      antialias(false)
      line_width(1)
    end
    node_label.label do 
      text_style {|l| color[l.group]}
    end
  end
end
vis.render()
puts vis.to_svg