我可以使用点名语言直接使用GraphViz或使用PHP使用PEAR包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.
}
点文件可以为所有四种元素类型(图形,集群,节点,边缘)设置属性默认值。似乎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 :(得分:0)
这只是一个想法,无法测试它:您是否尝试过简单地添加名为 node (或 edge )的节点并在该节点上定义属性?
像$gv->addNode('node', array('style'=>'filled', 'fixedsize'=>true))
答案 1 :(得分:0)
当前的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";
}
}
//...
我希望这对某人有用。