我正在使用 Graphviz 渲染一些层次结构。到目前为止,对于实现我正在寻找的目标,子图的使用并不是最佳选择。
这是我想要得到的
(颜色代表层次结构中的不同层级,因此它们需要遵循此顺序)。为了制作这张图片,我使用了不可见链接,但这在现实世界场景中确实不是一个选项。
使用这个 .dot 文件
graph {
// Global config
rankdir=BT
node [style="filled" fontcolor="white" shape="box"]
// Rank (hierarchies)
{ rank=same; 258 }
{ rank=same; 259 }
{ rank=same; 260 }
{ rank=same; 261 262 }
// Nodes
// Tasks
258 [label="John Cleese" fillcolor="#E8B04D"]
// Project Goals
259 [label="Michael Palin" fillcolor="#C0C56B"]
// Identities
260 [label="Eric Idle" fillcolor="#FF8D61"]
// Virtues
261 [label="Graham Chapman" fillcolor="crimson"]
262 [label="Terry Jones" fillcolor="crimson"]
// Edges
259 -- 260 [style="bold" color="#3790af"]
}
Graphviz 是否可以在边缘之前尊重等级?如果是这样,我将如何进行?
最佳答案
您的问题很容易通过添加一些不可见的边缘来解决,这些边缘可以使各种等级(您正确设置)按您想要的方式工作。请注意在底部附近简单添加了三个不可见的边缘:
graph {
// Global config
rankdir=BT
node [style="filled" fontcolor="white" shape="box"]
// Rank (hierarchies)
{ rank=same; 258 }
{ rank=same; 259 }
{ rank=same; 260 }
{ rank=same; 261 bl 262 }
// Nodes
// Tasks
258 [label="John Cleese" fillcolor="#E8B04D"]
// Project Goals
259 [label="Michael Palin" fillcolor="#C0C56B"]
// Identities
260 [label="Eric Idle" fillcolor="#FF8D61"]
// Virtues
261 [label="Graham Chapman" fillcolor="crimson"]
262 [label="Terry Jones" fillcolor="crimson"]
// Edges
259 -- 260 [style="bold" color="#3790af"]
258--259 [style=invis]
260--261 [style=invis]
260--262 [style=invis]
260--bl [style=invis]
bl [style=invis label="" height=0, width=0]
}
我还在中心添加了一个不可见的平衡节点,bl
以帮助更好地使图形居中。
关于如果节点之间没有边,Graphviz 将忽略等级属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846207/