首页 > 解决方案 > graphviz - 防止节点和边在没有样条的情况下重叠

问题描述

我在 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 > graph.png)。到目前为止,我明白了。

fdp 的结果

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

结果与neato

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

标签: graphviz

解决方案


有几个问题:

  • layout=fdp导致使用 fdp 布局引擎,不管命令行说什么
  • 如果要确定节点位置,请使用neato -n (见下文)
  • 通过添加一个到您确定位置的位置(它不会改变)
  • 在这里没用,它是定向的(自上而下)

如果你删除所有! ,我想你会得到你想要的。 在此处输入图像描述


推荐阅读