【问题标题】:How can I optimize GraphViz output width?如何优化 GraphViz 输出宽度?
【发布时间】:2011-06-19 13:13:04
【问题描述】:

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

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

注 2:我想我使用点 :)

注3:这里是Ruby code

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

【问题讨论】:

  • 哪种布局 - 点式还是净式?你有样品吗?
  • 点我想:) Here is a sample
  • 我正在考虑生成图像(点文件)的代码示例。但从链接到的图片来看,ratio="compress"size 应该会产生较小的结果。另外,您是否尝试过其他布局(neato)?使用neato 的结果可能更有趣。
  • 我通过 Ruby 使用 GraphViz。我没有相应的 GraphViz 代码。这就是为什么我不知道我是否真的在使用 dot。现在我很确定我正在使用 dot。
  • 这里是 Ruby 代码:gist.github.com/1062005

标签: ruby graphviz


【解决方案1】:

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

根据您的特定图表,您可能会在使用时获得较小的图表

ratio="compress"

(不过,您必须指定 size

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


编辑:

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

unflatten 是 dot 的预处理器,用于改进方面 具有许多叶子或断开节点的图的比率。通常 这种图表的布局通常非常宽或高。展平 插入不可见的边缘或调整边缘上的 minlen 以改善 布局压缩。

从来没有用过,但我觉得值得一试。

【讨论】:

  • 它似乎工作(output here)但一些子节点混淆了。你知道如何增加父节点和子节点之间的高度吗?
  • 两个rank之间的垂直距离可以通过设置ranksep属性来调整。
  • unflatten 很棒。真的值得一试,也是这里唯一有助于解决问题的工具。
  • @fiatjaf 我同意,unflatten 很棒。这是otheranswers中的一些未展平的examples
【解决方案2】:

我还遇到了neato 在盒子之间留出大量空间的问题。最后,我还使用以下图形设置获得了合理的结果:

overlap=prism, overlap_scaling=0.01, ratio=0.7

测试重叠缩放和比率的不同值特别有用。使用较小的示例(

我花了很长时间才确定这些设置,这些设置记录在 http://www.graphviz.org/doc/info/attrs.html

【讨论】:

    【解决方案3】:

    你可以试试ratio参数。

    【讨论】:

    • 我做不到...我尝试了很多参数。我用一个示例链接编辑了我的帖子。我想要么增加父母和孩子之间的垂直空间,要么让孩子的位置交替,所以宽度会减小。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多