【问题标题】:Is there a way to have different edge splines between nodes in the same cluster vs between nodes in different clusters using fdp layout in graphviz?有没有办法使用graphviz中的fdp布局在同一集群中的节点之间与不同集群中的节点之间具有不同的边样条?
【发布时间】:2020-07-02 00:07:59
【问题描述】:

我正在创建一个包含多个集群的图表。属于同一个簇的节点之间有边,属于不同簇的节点之间有边。我正在使用fdp 布局。有没有办法让集群内的节点使用一种类型的边缘路由,而属于不同集群的节点使用另一种类型的边缘路由?

例如,我想将splines=ortho 用于前者,将splines=compound 用于后者。我尝试这样做,但生成的图表似乎只使用主图表中指定的splines 值。

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

    我很确定它不能单次通过 - 样条线 是图形级属性。但是我认为它可以通过 5-pass 技术来完成:

    1. 编辑输入文件
    • 移动集群内的所有集群内边缘
    • edge[keep=1] 添加到每个集群的开头
    1. 运行fdp -Tdot -Gsplines=ortho(适用于所有)添加节点和边缘路由
    2. 通过gvpr(或python?)运行第1步输出到
    • 将所有节点node[pin=true]固定在图表的开头
    • 对于 keep==1 的每条边,将 pos 属性复制到(新)keeppos 属性
    1. 通过 fdp -s -Tdot -Gsplines=compound 运行步骤 2 输出 - 这将覆盖所有边缘 pos 值
    2. 通过 gvpr(或 python?)运行第 3 步输出以将 pos 替换为 keeppos(如果 keeppos!="")
    3. 通过 neato -s -n2 -Tsvg/png/...运行第 4 步输出

    哇!听起来很恶心,但它似乎工作
    p.s.第 3 步和第 5 步需要使用 -s 选项来解决缩放问题
    pps因为需要固定节点,所以只有 fdpneato(不是 dot

    这是一个命令行:

    f=multispline.gv;
    F=`basename $f .gv`
    fdp -Gsplines=true -Tdot $f | 
    gvpr -c 'N{pin="true"}E[keep=="1"]{keeppos=$.pos}'| 
    fdp -s -Gsplines=ortho -Tdot | 
    gvpr -c 'E[keeppos!=""]{pos=keeppos}' | 
    neato -s -n2 -Tsvg >oo.svg
    

    【讨论】:

    • 我试试这个!
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 2020-04-01
    • 1970-01-01
    • 2021-11-02
    • 2021-02-14
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多