GraphVizを直接使用するか、PHPを使用してPEARパッケージImage_GraphVizを使用して、以下のグラフをドット言語で生成できます。Image_Graphvizパッケージを使用してデフォルトのノード属性を設定する
//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オブジェクトにノードやエッジのデフォルトの属性値を追加するための構文を知っていますか?
悲しいことに、 "node"という美しいフォーマットの余分なノードが追加され、残りのノードのフォーマットにはまったく影響しません。 – dnagirl
ああ、それは簡単すぎるだろう... * node *の前後に余分なスペースを入れてもう一度試してみてください - ノード名が追加されたときにトリムされないと思います。余分な文字では、[_エスケープ](http://pear.php.net/package/Image_GraphViz/docs/latest/__filesource/fsource_Image_GraphViz__Image_GraphViz-1.3.0ImageGraphViz.php.html#a621)関数は、それを「安全なID」にエスケープしないことがあります。 – marapet
これでうまくいかない場合は、プロパティを追加して 'parse()'を変更することはあまり複雑ではありません。 – marapet