Graphviz DOT如何将节点排列成圆形,布局太过“紧凑”?

21

我已经做了一半,请查看编辑部分

好的,这是我的问题:我正在生成一个Python模块的图表,包括所有文件及其函数/方法/类。

我希望将节点围绕其父节点分组成圆圈,目前所有内容都在一个巨大的水平行上,使整个图表超过50k像素宽,并且svg转换器失败(仅呈现约一半的图表)。

我查看了文档,但找不到任何似乎能解决问题的东西。

所以问题是:
有没有简单的方法来实现这一点,还是我必须自己布局整个图表? :/

编辑:
由于Andrews的评论,我得到了正确的布局,唯一的问题现在是它有点“紧凑”...那么现在的问题是,如何解决这个问题?

Test


5
你尝试使用过"neato"布局吗?它可能会得到你想要的结果。 - Andrew
刚刚尝试了一下通过命令行开关-K,有点可行,见我的编辑。 - Ivo Wetzel
4
有点晚了,但如果您遇到了重叠的布局问题,只需设置"overlap=false"即可解决。 - pablasso
3个回答

36
layout slightly: use a lighter color scheme, eg, node_A [color=lightblue]; this will reduce the visual weight of your graph and make it appear less cluttered.

我已经提到了影响您当前布局的所有最重要参数,并为这些参数建议了值。但我认为只需应用其中几个建议即可获得所需的布局。

  • 减小边缘权重,例如 [weight=0.5];这将使得边变长,导致您目前在图表中看到的紧密聚集的集群“扩散”。

  • 去掉节点边框,node_A [color=none; shape=plaintext]; 特别是对于椭圆形节点,节点的总空间中有大量“未使用”的部分(即未用于显示节点标签)。

  • 明确定义节点的字体大小(节点边框被放大以包围节点文本,这意味着给定节点的字体大小和文本量对其大小有重要影响);[fontsize=11] 应足够大且可读,同时还可以减少“混乱”的外观(默认大小为14)。

  • 通过“nodesep”增加节点之间的最小距离;例如,nodesep=2.0;这将直接解决您对图表“过于紧凑”的反对意见。(在节点、边缘或图形的所有参数中,“nodesep”和“ranksep”可能会对dot绘制图形产生最大影响。在您的情况下,看起来您只有两个节点等级;“ranksep”设置不同等级节点之间的最小距离——看起来组成您的图表的所有节点都处于同一等级(除了中心的少数顶级节点)。

  • 明确定义整个图的大小,例如 size="7.75,10.25"(确保您的图适合8.5 x 11页面并占据整个空间)

  • 还有一个纯美学建议,最多只能稍微帮助您的布局:使用较浅的颜色方案,例如 node_A [color=lightblue];这将减轻您的图表视觉负担,并使其看起来不那么杂乱。

图形显得不那么混乱:默认的边缘和节点字体颜色都是黑色。图形上大部分的墨水都来自这两种结构(特别是如果您删除节点边框),因此我建议将节点(文本)字体颜色或边缘字体颜色设置为“蓝色”以帮助眼睛区分这两组图形结构。

1
事实上,我在这里报告了一个非常类似的问题,使用 ranksep 是扇形图的关键配置。谢谢! - Bruno Penteado
你可以帮我找一下相关的文档吗?还有工作代码示例吗? - Jesvin Jose

7
如果图形过于紧凑,您需要调整边缘长度。根据图形布局,您有几个选项:
  1. 如果您的布局是sfdp或fdp,请调整K属性。默认值为0.3。
  2. 对于neato(或fdp),请调整len属性。neato的默认值为1.0,fdp的默认值为0.3。
  3. 对于dot,您可以使用minlen属性来定义最小边长。默认值为1。
您还可以尝试调整图形属性model以确定聚类行为。具体来说,请尝试subset。我相信这会为您处理lenhttp://www.graphviz.org/doc/info/attrs.html#d:model 此外,您可以使用缩放技术完全消除重叠:http://www.graphviz.org/doc/info/attrs.html#d:overlap

0

我有大约500个节点,并使用了Doug的建议。

这是我的示例代码(使用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')

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