【问题标题】:Graphviz DOT arrange Nodes in circles, layout too "compact"Graphviz DOT 将节点排列成圆形,布局太“紧凑”
【发布时间】:2018-07-20 10:31:42
【问题描述】:

我到了一半,请看编辑

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

我想这样安排,节点在它们的父节点周围聚集成圆圈,目前所有东西都在一个巨大的水平行上,这使得东西 >50k 像素宽,也让 svg 转换器失败(只渲染大约一半图)。

我浏览了docs,但找不到任何似乎可以解决问题的方法。

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

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

【问题讨论】:

  • 您是否尝试过使用“neato”布局?它可能会给出你想要的结果。
  • 刚刚通过命令行开关 -K 尝试过,有点工作看我的编辑。
  • 有点晚了,但是当你用neato得到这个重叠的布局时,只需设置“overlap=false”。

标签: layout graph graphviz dot


【解决方案1】:

我已经提到了影响您当前布局的所有最重要的参数,然后为这些参数提供了建议值。不过,我怀疑你可以通过应用这些建议来获得你想要的布局。

  • 降低边缘权重,例如,[weight=0.5];这将使 边缘较长,导致紧 您当前在您的 图表以“扇出”。

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

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

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

  • 显式设置图的总大小,例如, size="7.75,10.25"(确保您的 图表适合 8.5 x 11 页面和 它占据了整个空间)

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

【讨论】:

  • 事实上,我在这里报告了一个非常相似的问题,使用ranksep 是扇出图表的关键配置。谢谢!
  • 你能带我去看看这个文档吗?有工作代码示例?
【解决方案2】:

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

  1. 如果您的布局是 sfdp 或 fdp,请调整 graph 属性 K。默认值为 0.3。
  2. 对于neato(或fdp),调整edge 属性len。默认值是 1.0,neato 和 fdp 0.3。
  3. 对于点,您可以使用 edge 属性 minlen,它是最小边长。默认值为 1。

您可能还想弄乱决定聚类行为的图形属性 model。具体来说,尝试子集。我相信这会为您处理 lenhttp://www.graphviz.org/doc/info/attrs.html#d:model

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

【讨论】:

    【解决方案3】:

    我有大约 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 2018-12-14
      • 2019-12-23
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多