use GraphViz; open DATA, "<", "/my/data"; my $plot = GraphViz->new( layout => 'dot', # <--or neato, or circo etc node => {height => '0.05', shape => 'box',fontsize => '11', fontname => 'Times-Roman', style=>'filled', color=>'lightgray'}, bgcolor=> 'white', center=> 'true', dpi=> '1800', #resolution of the graph, higher = sloower ... more general parameters following here... ); while (){ my ($idname, $fooname, $blah, $blah2, $impact) = split //,$_, 5 # split ID in fields next if $impact = 0 # no impact between tests, so we discard this id->foo node $plot->add_node($idname, label => "$idname"); #create parent node $plot->add_edge($idname => $fooname, size => $impact) # trace an arrow from to each id to its foo #i don't remember if size is valid, but instead you could use better the tag color => $mycolor The goal with this is that you can create easily a customized %colorhash (when key = impact and value is a custom color... you can have more, less hot, more blue, more red... for any impact range } # whe close while loop # and we print the plot to a svg file, or gv, or png, or txt... svg file looks reasonably good in a browser and you can zoom it a loot $plot->as_svg("my_big_plot.svg"); system("iceweasel my_big_plot.svg");