Download

Rdoc (0.5.0)

SVN

gem

What’s this?


GraphvizR is graphviz adapter for Ruby, and it can:

  • generate a graphviz dot file,
  • generate an image file by means of utilizing graphviz,
  • interprete rdot file and generate an image file,
  • and, generate a graph image file in rails application as a rails plugin.

How to install

gem install graphviz_r

Additionaly, if you want to use this in rails:

script/plugin install http://technohippy.net/svn/repos/graphviz_r/trunk/vendor/plugins/rdot

How to use

Generate a dot string

code 1.

gvr = GraphvizR.new 'sample'
gvr.graph [:label => 'example', :size => '1.5, 2.5'] 
gvr.beta [:shape => :box]                            
gvr.alpha >> gvr.beta
(gvr.beta >> gvr.delta) [:label => 'label1']
gvr.delta >> gvr.gamma
gvr.to_dot

result 1.

digraph sample {
  graph [label = "example", size = "1.5, 2.5"];
  beta [shape = box];
  alpha -> beta;
  beta -> delta [label = "label1"];
  delta -> gamma;
}

code 2.

gvr = GraphvizR.new 'sample'
gvr.graph [:size => '1.5, 2.5']
gvr.node [:shape => :record]
gvr.node1 [:label => "<p_left> left|<p_center>center|<p_right> right"]
gvr.node2 [:label => "left|center|right"]
gvr.node1 >> gvr.node2
gvr.node1(:p_left) >> gvr.node2
gvr.node2 >> gvr.node1(:p_center)
(gvr.node2 >> gvr.node1(:p_right)) [:label => 'record']
gvr.to_dot

result 2.

digraph sample {
  graph [size = "1.5, 2.5"];
  node [shape = record];
  node1 [label = "<p_left> left|<p_center>center|<p_right> right"];
  node2 [label = "left|center|right"];
  node1 -> node2;
  node1:p_left -> node2;
  node2 -> node1:p_center;
  node2 -> node1:p_right [label = "record"];
}

code 3.

gvr = GraphvizR.new 'sample'
gvr.cluster0 do |c0|
  c0.graph [:color => :blue, :label => 'area 0', :style => :bold]
  c0.a >> c0.b
  c0.a >> c0.c
end
gvr.cluster1 do |c1|
  c1.graph [:fillcolor => '#cc9966', :label => 'area 1', :style => :filled]
  c1.d >> c1.e
  c1.d >> c1.f
end
(gvr.a >> gvr.f) [:lhead => :cluster1, :ltail => :cluster0]
gvr.b >> gvr.d
(gvr.c >> gvr.d) [:ltail => :cluster0]
(gvr.c >> gvr.f) [:lhead => :cluster1]
gvr.to_dot

result 3.

digraph sample {
  subgraph cluster0 {
    graph [color = blue, label ="area 0", style = bold];
    a -> b;
    a -> c;
  }
  subgraph cluster1 {
    graph [fillcolor = "#cc9966", label = "area 1", style = filled];
    d -> e;
    d -> f;
  }
  a -> f [lhead = cluster1, ltail = cluster0];
  b -> d;
  c -> d [ltail = cluster0];
  c -> f [lhead = cluster1];
}

Generate an image file

code

gvr = GraphvizR.new 'sample'
gvr.graph [:label => 'example', :size => '1.5, 2.5'] 
gvr.beta [:shape => :box]                            
gvr.alpha >> gvr.beta
(gvr.beta >> gvr.delta) [:label => 'label1']
gvr.delta >> gvr.gamma
gvr.output  ## not use `to_dot' but `output'

result

basic.png

Interprete rdot file

rdot file is evaluated in context of GraphvizR instance.

record.rdot

graph [:size => '1.5, 2.5']
node [:shape => :record]
node1 [:label => "<p_left> left|<p_center>center|<p_right> right"]
node2 [:label => "left|center|right"]
node1 >> node2
node1(:p_left) >> node2
node2 >> node1(:p_center)
(node2 >> node1(:p_right)) [:label => 'record']

command

$ ./bin/graphviz_r record.rdot

result

record.png

On Rails

use render :rdot in controller

class RdotGenController < ApplicationController
  def index
    render :rdot do
      graph [:size => '1.5, 2.5']
      node [:shape => :record]
      node1 [:label => "<p_left> left|<p_center>center|<p_right> right"]
      node2 [:label => "left|center|right"]
      node1 >> node2
      node1(:p_left) >> node2
      node2 >> node1(:p_center)
      (node2 >> node1(:p_right)) [:label => 'record']
    end
  end
end

use rdot view template

class RdotGenController < ApplicationController
  def index
    @label1 = "<p_left> left|<p_center>center|<p_right> right"
    @label2 = "left|center|right"
  end
end

# view/rdot_gen/index.rdot
graph [:size => '1.5, 2.5']
node [:shape => :record]
node1 [:label => @label1]
node2 [:label => @label2]
node1 >> node2
node1(:p_left) >> node2
node2 >> node1(:p_center)
(node2 >> node1(:p_right)) [:label => 'record']

Other useful information

You can direct a node not only by method but also as a hash key. It is more useful when you need to create nodes dynamicaly in your code.

In short,

gvr.b >> gvr.d

means

gvr[:b] >> gvr[:d]