2011-06-21 6 views
4

GraphVizを直接使用するか、PHPを使用してPEARパッケージImage_GraphVizを使用して、以下のグラフをドット言語で生成できます。Image_Graphvizパッケージを使用してデフォルトのノード属性を設定する

graphviz png image from below code

//DOT language 
digraph test{ 
    URL="http://example.com/fish/"; 
    bgcolor="#BBCAF2"; 

    //defaults for all nodes 
    node[style=filled, 
     fillcolor=white, 
     color="#8A94B4", 
     fixedsize=true, 
     fontname="sans-serif", 
     fontsize=8, 
     URL="?fish_id=\N", 
     margin="0.02,0.02"]; 

    //defaults for all edges 
    edge[arrowsize=0.6, 
     sametail=true, 
     fontsize=8, 
     fontname="sans-serif"]; 

    //a few edges 
    57->23[color="blue"]; 42->23[color="red"]; 
    25->26[color="blue", label="10M"]; 25->26[color="red", label="10F"]; 
    //etc. 

    //a few nodes 
    29[label="100128 AB"]; 
    38[label="100730 AB"]; 
    39[label="110208"]; 
    //etc. 
} 

ドットファイルは、すべての4つの要素タイプ(グラフ、クラスタ、ノード、エッジ)の属性のデフォルト値を設定することができます。 Image_GraphVizは、グラフレベルの属性のデフォルトしか設定できないようです。

<?php 
$gatts=array(//defaults for graph level attributes 
    'URL'=>"http://example.com/fish/", 
    'bgcolor'=>"#ff0000", 
    'font'=>"sans-serif", 
); 

$gv=new Image_GraphViz(true,$gatts,'test',false,true); 

$q_ne="SELECT parentname, parent_id, childname, child_id, parenttype, parentcount 
     FROM fish_crosses"; 
$r_ne=$dbii->query($q_ne); 
while($ne=$r_ne->fetch_assoc()){ 
    $nodeatts=array('label' => $ne['parentname'], 
        'style'=>"filled", 
        'fillcolor'=>'#ffffff', 
        'fixedsize'=>true, 
        'fontname'=>"sans-serif", 
        'fontsize'=>8); 
    if(!$ne['child_id']) { 
     $gv->addNode($ne['parent_id'], $nodeatts); 
     continue; 
    } 
    if($ne['parenttype']=='dam'){ 
     $ecolor= '#ff0000'; 
     $elabel= $ne['parentcount'].'F'; 
    } else { 
     $ecolor= '#0000ff'; 
     $elabel=$ne['parentcount'].'F'; 
    } 
    $edgeatts=array('color'=>$ecolor, 'fontname'=>'sans-serif','fontsize'=>8); 
    if($ne['parentcount']) $edgeatts['label']=$elabel; 

    $gv->addEdge(array($ne['parent_id']=>$ne['child_id']), $edgeatts); 
    $gv->addNode($ne['parent_id'], $nodeatts); 
    $gv->addNode($ne['child_id'], $nodeatts); 
} 

echo $gv->image('png'); 
?> 

誰もがImage_GraphVizオブジェクトにノードやエッジのデフォルトの属性値を追加するための構文を知っていますか?

答えて

0

$gv->addNode('node', array('style'=>'filled', 'fixedsize'=>true))のように現在のImage_GraphVizパッケージは、デフォルトのノード/エッジ/クラスタ属性を扱うことができないことが表示されます。私はこれらの関数を変更してクラスを拡張しました:_escape_escapeArray、およびparseここに私の変更があります:

function _escape($input, $html = false) { 
     switch (strtolower($input)) { 
     //removed case 'node' and case 'edge' so they won't be quoted 
     case 'graph': 
     case 'digraph': 
     case 'subgraph': 
     case 'strict': 
      return '"'.$input.'"'; 
     } //... 


function _escapeArray($input) { 
//... 
     default: 
      if(is_array($v)){ 
       $v=$this->_escapeArray($v); //added recursion to allow default node/edge/cluster attribute sets 
      } else { 
       $v = $this->_escape($v); 
      } 
      $k = $this->_escape($k); 
     } 
//... 

function parse() { 
//... 
    foreach ($attr as $key => $value) { 
     if(is_array($value)){ 
      $a=implode(',', 
      array_map(function($v,$k){ return $k . '='.$v;}, 
       array_values($value), 
       array_keys($value))); 
     //default format for node/edge/cluster: thing[att1="blah", att2="foo"]; 
      $parsedGraph .= $indent.$key.'['.$a."];\n"; 
     } else { 
      $parsedGraph .= $indent.$key.'='.$value.";\n"; 
     } 
    } 
//... 

私はこれが誰かにとって有益だと思っています。

0

これは単なるアイデアで、それをテストすることはできません:あなたは、単にノード(またはエッジ)という名前のノードを追加し、そのノード上の属性を定義しようとしたことがありますか?

何か

+0

悲しいことに、 "node"という美しいフォーマットの余分なノードが追加され、残りのノードのフォーマットにはまったく影響しません。 – dnagirl

+0

ああ、それは簡単すぎるだろう... * node *の前後に余分なスペースを入れてもう一度試してみてください - ノード名が追加されたときにトリムされないと思います。余分な文字では、[_エスケープ](http://pear.php.net/package/Image_GraphViz/docs/latest/__filesource/fsource_Image_GraphViz__Image_GraphViz-1.3.0ImageGraphViz.php.html#a621)関数は、それを「安全なID」にエスケープしないことがあります。 – marapet

+0

これでうまくいかない場合は、プロパティを追加して 'parse()'を変更することはあまり複雑ではありません。 – marapet

関連する問題