在绘制图形之前删除具有0条边的节点(dot,graphviz)

时间:2017-05-14 15:30:59

标签: graphviz dot

在使用dot -Tpng mcve.gv -o mcve.png

进行绘图之前,如何从图表中删除没有边的节点?

当前结果: enter image description here 通缉结果: enter image description here

阅读文档并在网上搜索我发现以下answer乍一看似乎很好。 (删除所有带0边的节点)

vpr -c 'N[$.degree==0]{delete($);}' mvce.gv | dot ...

不幸的是,此命令出现以下错误:

gvpr: "<command line>", line 2: delete($)<<< 
 -- cannot convert node_t to graph_t

从我阅读N[predicate]{action}的内容看起来很奇怪应该只在节点上执行action

我的图表的最小示例:

graph main_graph {
  node1;
  node2;
  node3;
  node4; // not used

  subgraph graph1 {
    edge [color=red,penwidth=2]
    node1 -- node2;
  }

  subgraph graph2 {
    edge [color="blue",penwidth=2]
    node2 -- node3;
    node1 -- node3;
  }
}

1 个答案:

答案 0 :(得分:0)

gvpr doc表示delete实际上有2个参数 - 首先是要删除的图形,然后是要删除的对象。

您只是传递一个节点,这似乎解释了转换错误。

由于没有对可用图表的引用,传递NULLroot(参见相同的文档)可以作为参数传递:

gvpr -c "N[$.degree==0]{delete(root, $)}" mygraph.gv
gvpr -c "N[$.degree==0]{delete(NULL, $)}" mygraph.gv

将导致int

graph main_graph {
    subgraph graph1 {
        edge [color=red,
            penwidth=2
        ];
        node1 -- node2       [color=red,
            penwidth=2];
    }
    subgraph graph2 {
        edge [color=blue,
            penwidth=2
        ];
        node1 -- node3       [color=blue,
            penwidth=2];
        node2 -- node3       [color=blue,
            penwidth=2];
    }
}