如何优化GraphViz输出的宽度?

26

我制作的图表具有巨大的宽高比:它们的大小为51706 x 503像素。如何告诉GraphViz优化宽度?

注1:实际上,该图是一棵树,每个节点都有很多子节点。这里是一个示例

注2:我想我使用dot :)

注3:这里是Ruby代码

def graph_node(n, parent=nil, depth=0)
  #print n, " "
  gn = @g.add_node(n.object_id.to_s, :label=>n.to_graphviz, :shape=>"Mrecord")
  if parent
    e = @g.add_edge(parent, gn)
  end
  if n == @current_pos_node
    gn[:color] = "brown3"
    gn[:style] = "filled"
  elsif @s.tree.pv(@current_pos_node).include?(n)
    gn[:color] = "cadetblue"
    gn[:style] = "filled"
  elsif @s.tree.pv(@root).include?(n)
    gn[:color] = "yellow"
    gn[:style] = "filled"
  end
  return if !n.children # or depth == 2
  i = 0
  for c in n.children
    graph_node(c, gn, depth+1)
    i += 1
    #break if i > 2
  end
end

def graph(name="tree", root_node=@current_pos_node)
  @g = GraphViz::new("G")
  #@g['sep'] = "10,100"
  #@g["overlap"] = "compress"
  #@g["rankdir"] = "BT"
  #@g["ratio"] = "0.9"
  @g["size"] = "350,500"
  graph_node(root_node)
  @g.output(:svg => "#{name}.svg")
end

哪种布局 - 点状还是neato?你有样例吗? - marapet
我在考虑提供生成图像的代码示例(点文件)。但是从链接的图片中可以看出,ratio="compress"size 结合使用可以得到更小的结果。另外,您尝试过其他布局方式(如neato)吗?使用neato可能会得到更有趣的结果。 - marapet
我正在通过Ruby使用GraphViz。我没有相应的GraphViz代码。这就是为什么我不知道我是否真的在使用dot。现在我非常确定我正在使用dot。 - MickaelFM
这是 Ruby 代码: https://gist.github.com/1062005 - MickaelFM
3个回答

17

如果图形由几个不相连的树组成,您可以将它们分开(如Graphviz: break flat but sparsely connected graph into multiple rows?中所述)。

根据您的具体图形,在使用时可能会得到一个较小的图形

ratio="compress"

(但您需要指定 size

对于特定图形的详细优化,您可以添加 rank 属性,并手动在不同的级别上分配节点。


编辑:

有一个名为 unflatten 的 graphviz 工具似乎正好是为此目的而存在的:

unflatten 是用于改善拥有许多叶子节点或断开节点的图形的纵横比的 dot 预处理器。 对于这样的图形,通常布局非常宽或高 unflatten 插入不可见的边缘或调整边缘上的最小值,以改善布局压缩。

从未有过使用它的需求,但我认为值得一试。


似乎它能够工作(输出在此处),但是一些子节点混淆了。你知道我该如何增加父节点和子节点之间的高度吗? - MickaelFM
两个排名之间的垂直距离可以通过设置“ranksep”属性来调整。 - marapet
"unflatten"很棒。真的值得一试,也是这里唯一能帮助解决问题的工具。 - fiatjaf
1
@fiatjaf 我同意,unflatten 很棒。这里有一些 unflatten 的例子,在其他 答案中。 - marapet

8

我也遇到了一个问题,就是Neato在方框之间留下了很多空格。最终,我通过以下图形设置获得了合理的结果:

overlap=prism, overlap_scaling=0.01, ratio=0.7

测试不同的overlap_scaling和ratio值特别有用,对于小规模的例子(<50个节点)使用gvedit.exe查看效果最快。

我花了相当长的时间才找到这些设置,它们在http://www.graphviz.org/doc/info/attrs.html中有记录。


3
你可以尝试调整比率参数。

我做不到...我尝试了许多参数。我编辑了我的帖子,并附上一个示例链接。我想要的是增加父元素和子元素之间的垂直空间或交替子元素位置,以减小宽度。 - MickaelFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接