Graph::Writer::GraphViz - GraphViz Writer for Graph object


Graph-Writer-GraphViz documentation Contained in the Graph-Writer-GraphViz distribution.

Index


Code Index:

NAME

Top

Graph::Writer::GraphViz - GraphViz Writer for Graph object

SYNOPSIS

Top

  my @v = qw/Alice Bob Crude Dr/;
  my $g = Graph->new(@v);

  my $wr = Graph::Writer::GraphViz->new(-format => 'dot');
  $wr->write_graph($g,'/tmp/graph.simple.dot');

  my $wr_png = Graph::Writer::GraphViz->new(-format => 'png');
  $wr_png->write_graph($g,'/tmp/graph.simple.png');

  Graph::Writer::GraphViz->new(
	-format => 'png',
	-layout => 'twopi',
	-ranksep => 1.5,
	-fontsize => 8
        -edge_color => 'grey',
        -node_color => 'black',
       )->write_graph($g,'/tmp/graph.png');

DESCRIPTION

Top

Graph::Writer::GraphViz is a class for writing out a Graph object with GraphViz module. All GraphViz formats should be supported without a problem.

METHODS

Top

new()

Unlike other Graph::Writer modules, this module provide an extra parameter '-format' to new() method, in order to save different format. Other supported GraphViz parameters are -layout, -ranksep, -shape, -fontsize, -arrowsize. Please see the SYNOPSIS for example usage.

Valid format depends on those GraphViz as_fmt methods on your system, like, 'gif' if you have 'as_gif', 'text' if you can do 'as_text'.

SEE ALSO

Top

Graph, Graph::Writer, GraphViz

CREDITS

Top

Thanks for RURBAN@cpan.org for noticing tests failure on different platforms.

COPYRIGHT

Top


Graph-Writer-GraphViz documentation Contained in the Graph-Writer-GraphViz distribution.

package Graph::Writer::GraphViz;
use strict;
use IO::All;
use GraphViz;
use Graph::Writer;
use vars qw(@ISA);
@ISA = qw(Graph::Writer);

our $VERSION = '0.10';

# Global GraphViz Parameters
my %graph_param;
my %edge_param;
my %node_param;

my @param_keys = qw/format layout ranksep rankdir
		    no_overlap concentrate epsilon ratio
		    splines shape fontsize fontcolor overlap
                    directed
		    /;

my @edge_keys = qw/color arrowsize minlen weight fontsize fontname fontcolor
		   color style dir tailclip headclip arrowhead arrowtail
		   labeldistance port_label_distance decorateP samehead sametail
		   constraint /;

my @node_keys = qw/color height width shape fontsize fontname
		   fontcolor color fillcolor style rank/;

sub _init  {
    my ($self,%param) = @_;
    $self->SUPER::_init();
    for(@param_keys) {
	$graph_param{$_} = $param{"-$_"}
	    if(defined $param{"-$_"});
    }

    for(@edge_keys) {
	$edge_param{$_} = $param{"-edge_$_"} if defined $param{"-edge_$_"};
    }

    for(@node_keys) {
	$node_param{$_} = $param{"-node_$_"} if defined $param{"-node_$_"};
    }

    $graph_param{format} ||= 'png';
    $edge_param{color} ||= 'black';
    $node_param{color} ||= 'black';
}

sub _write_graph {
    my ($self, $graph, $FILE) = @_;
    my $grvz = $self->graph2graphviz($graph);
    my $as_fmt = 'as_' . $graph_param{format};
    if(ref($FILE) =~ '^IO::All') {
	my $f = $grvz->$as_fmt;
	$f > $FILE;
    } else {
	$grvz->$as_fmt($FILE);
    }
}

sub graph2graphviz {
    my ($self,$g) = @_;
    $graph_param{directed} = $g->directed;
    my $r = GraphViz->new(%graph_param,
			  node => \%node_param,
			  edge => \%edge_param);
    $self->add_nodes($r,$g);
    $self->add_edges($r,$g);
    return $r;
}

sub add_edges {
    my ($self,$r,$g) = @_;
    my @e = $g->edges;
    for (@e) {
        my ($a,$b) = @$_;
	my %param;
	if($g->has_edge_weight($a,$b)) {
	    my $w = $g->get_edge_weight($a,$b);
	    $param{weight} = $w;
	}
	$r->add_edge($a,$b,%param);
    }
}

sub add_nodes {
    my ($self,$r,$g) = @_;
    my @v = $g->vertices;
    for (@v) {
	my %param;
        for my $attr (qw/style shape label color fillcolor rank cluster/) {
            if($g->has_vertex_attribute($_,$attr)) {
                my $w = $g->get_vertex_attribute($_,$attr);
                $param{$attr} = $w;
            }
        }
	$r->add_node($_,%param) ;
    }
    return $r;
}


1;
__END__