【问题标题】:graphviz - prevent nodes and edges overlapping without splinesgraphviz - 防止节点和边在没有样条的情况下重叠
【发布时间】:2020-05-05 20:29:45
【问题描述】:

我在 graphviz 中有一个简单的 fdp 图,其中有一堆节点(矩形和菱形)具有固定的位置,其中一些节点有子节点(椭圆形),我想自动围绕它们排列.

我希望其中的所有边都是直的,没有曲线或折线或任何东西(即由splines=false 给出),但我也希望这些子节点不与具有固定位置的节点之间的边重叠。使用固定位置是因为我需要固定节点之间的边缘完全垂直或水平。这可能是我可以通过迭代不同的start 值并希望下一个不会有重叠来实现的,但到目前为止这有点令人厌烦。

digraph G {

###GRAPH
layout=fdp
overlap=false
dpi=150
splines=false
inputscale=0.4
# fdp specific:
K=0.50
maxiter=2000
start=1251

###OBJECTS
node[shape=rectangle width=1.0 height=0.4 fixedsize=true]

vendor[label="Поставщик" pos="3,1!"
]

item[label="Товар" pos="0,2!"
]

post[label="Поставка" pos="2,2!"
]

check[label="Чек" pos="1,1!"
]

prod[label="Продажа" pos="0,0!"
]


###SUBOBJECTS
node[shape=oval width=1.5 height=0.5]
edge[arrowhead=none]

{
vendork[label=<<u>ID поставщика</u>>] "Название\nпоставщика" "Контакт\nдля связи"
}->vendor

{
itemk[label=<<u>ID товара</u>>]
Название Тип Подтип Характеристики "Розничная цена"
}->item

{
postk[label=<<u>ID записи</u>>] post1[label="ID товара"]
post2[label="Кол-во"]       post3[label="Цена поставки"]
post4[label="Дата"]     post5[label="Квитанция"]
}->post

{
prodk[label=<<u>ID продажи</u>>]    prod1[label="ID товара"]
prod2[label="Кол-во"]           prod3[label="Цена\nпродажи"]
prod4[label="Чек"]
}->prod

{
checkk[label=<<u>ID чека</u>>] Дата Кассир "Сумма" "НДС" "Итого" "Вид оплаты"
}->check

###CONNECTIONS
node[shape=diamond]
edge[arrowhead=open]

vendorpost[label="Поставляет" pos="3,2!"
]
vendorpost->vendor
vendorpost->post[arrowhead=openopen]

postitem[label="Поставлен" pos="1,2!"
]
postitem->item
postitem->post[arrowhead=openopen]

itemprod[label="Продан" pos="0,1!"
]
itemprod->item
itemprod->prod[arrowhead=openopen]

prodcheck[label="Включает" pos="1,0!"
]
prodcheck->prod[arrowhead=openopen]
prodcheck->check
}

(原谅西里尔人)

我正在编译时没有附加参数(即dot -Tpng graph.gv &gt; graph.png)。到目前为止,我明白了。

我也尝试过使用neato,但在大多数情况下,它会给出一个非常奇怪的结果,它似乎完全忽略了固定节点位置,并在任何它想要的地方绘制子节点:

我浏览了the documentation 中的属性列表,到目前为止,除了splines 之外似乎没有一个解决节点/边缘重叠的问题(除非我错过了一些东西)。我应该怎么做才能达到我想要的结果?

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    有几个问题:

    • layout=fdp 导致使用 fdp 布局引擎,无论命令行显示什么
    • 如果要确定节点位置,请使用 neato -n(见下文)
    • 在您确定 pos 的位置添加 !(它不会改变)
    • 在这里没用,它是有方向的(自上而下)

    如果你删除所有的,我想你会得到你想要的。

    【讨论】:

    • 我使用layout=fdp,因为我使用vimdot 脚本来编辑这些图表,这似乎不允许-n 参数并默认使用dot。另外,我希望“父”节点之间的所有边缘都是完全垂直或水平的,因此是固定的位置。我可以使用dot,但它适用于其他类型的图形,并且会(据我了解)将每个“子”节点放置在奇怪的行或列中。我确实在dot 中制作了另一个这样的图表,但是添加不可见的边缘以使其正常工作实在是太麻烦了。不过,带有 fdp 的隐形支撑梁看起来更好。
    【解决方案2】:

    到目前为止,我发现的一个解决方案是通过将其附加到图表来添加覆盖每个固定边(即具有固定位置的两个节点之间)的不可见拉伸节点:

    ###NO VERTICAL/HORIZONTAL EDGE/NODE INTERSECT HACK
    node[style=invis]
    node[width=0.1 height=2.0]
    t1[label="" pos="0,1.5!"]
    t2[label="" pos="0,0.5!"]
    t3[label="" pos="1,0.5!"]
    t4[label="" pos="3,1.5!"]
    node[width=2.0 height=0.1]
    t5[label="" pos="2.5,2!"]
    t6[label="" pos="1.5,2!"]
    t7[label="" pos="0.5,2!"]
    t8[label="" pos="0.5,0!"]
    node[style=normal]
    

    这就是我想要的,即移除所有与固定边缘的重叠:

    但是,这仅限于完全垂直/水平的边缘(请注意,“子”节点中仍然至少有 1 个重叠),总的来说,这似乎是一个非常老套的解决方案,因为我必须添加/更改那些每次我在图表中添加/更改更多节点时“支撑梁”。有没有更好的解决方案?

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 2018-02-12
      • 1970-01-01
      • 2012-02-28
      • 2019-04-24
      • 2011-04-27
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多