Graphviz DOT以圆圈排列节点,布局太“紧凑”

时间:2010-04-16 00:00:31

标签: layout graph graphviz dot

我已经到了一半,请看编辑

好的,这是我的问题,我正在生成一个python模块的图形,包括所有带有它们的函数/方法/类的文件。

我想安排它,节点聚集在它们的父节点周围,目前一切都在一个巨大的水平行上,这使得事物的宽度> 50k像素,并且让svg转换器失败(仅渲染了图表的一半)。

我经历了docs,但找不到任何似乎可以做到的伎俩。

所以问题是:
有没有一种简单的方法可以做到这一点,还是我必须自己布局整个事情? :/

修改
感谢安德鲁斯评论我有正确的布局,现在唯一的问题是它有点“紧凑”......所以现在的问题是,如何解决这个问题?

Test

3 个答案:

答案 0 :(得分:34)

我已经提到了影响当前布局的所有最重要的参数,然后是这些参数的建议值。尽管如此,我怀疑你可以通过应用其中一些建议来获得你想要的布局。

  • 减少边缘重量,例如[weight = 0.5];这将使 边缘更长,造成紧张 你目前看到的群集 图表'扇出'。

  • 摆脱节点边界,node_A [颜色=无;形状=明文]; 特别是对于椭圆形节点,a 占总数的很大一部分 节点空间'未使用'(即未使用) 显示节点标签)。

  • 显式设置字体大小 节点(节点边界是 放大使它们围绕着 节点文本,表示该字体 给定的文本大小和数量 节点对其有显着影响 尺寸); [fontsize = 11]应该很大 足够清晰,但也减少 “杂乱”的外表( 默认大小为14)。

  • 增加最小间隔 节点,通过'nodesep';例如,nodesep = 2.0;这将 直接解决您的异议 关于你的图表“也是 紧凑。“('nodesep'和'ranksep' 可能会影响点绘制图形的方式 比任何其他参数更多 节点,边或图。在你的情况下, 看起来你只有两个等级 节点; 'ranksep'设定最小值 不同节点之间的距离 排名 - 它看起来像所有节点 构成你的图表的是 相同等级(少数顶级除外) 中心的节点。)

  • 明确设置总图表尺寸,例如, size =“7.75,10.25”(确保你的 图表适合8.5 x 11页面和 它占据了整个空间)

  • 一个纯粹的美学建议 最多只能帮助你 图出现不那么混乱: 两个边和的默认fontcolor 节点是黑色的。大多数人 图表上的墨水来自这两个 结构(特别是如果你 删除节点边框),所以我会 例如设置节点 (文字)fontcolor或边缘 fontcolor为“蓝色”帮助眼睛 区分两组图 结构。

答案 1 :(得分:6)

如果太紧凑,你会想要弄乱边长。根据图表布局,您有几个选项:

  1. 如果您的布局是sfdp或fdp,请调整图形属性 K 。默认值为0.3。
  2. 对于neato(或fdp),调整边缘属性 len 。对于neato,默认值为1.0,对于fdp,默认值为0.3。
  3. 对于圆点,您可以使用边缘属性 minlen 这是最小边长。默认值为1。
  4. 您可能还想弄乱确定群集行为的图形属性 model 。具体来说,尝试子集。我相信这会为你处理 len http://www.graphviz.org/doc/info/attrs.html#d:model

    此外,您可以使用缩放技术删除所有重叠:http://www.graphviz.org/doc/info/attrs.html#d:overlap

答案 2 :(得分:0)

我大约有500个节点,并使用了道格的推荐。

这是我的示例代码(在python中有效):

f = Digraph('companies',filename='companies.gv',
          edge_attr={'weight':'1',
                     'fontsize':'11',
                     'fontcolor':'blue',
                     'len':'4'},
          graph_attr={'fixedsize':'false', 
                      'bgcolor':'transparent'},
          node_attr={'fontsize':'11', 
                     'shape':'plaintext', 
                     'color':'none',
                     'fontcolor':'black'})

f.attr(layout="neato")
f.attr(nodesep='3')
f.attr(ranksep='3')
f.attr(size='5000,5000')