graphviz,理顺skiplist?

graphviz,理顺skiplist?,graphviz,Graphviz,我制作了一个有向图来绘制skiplist,它做得相当好,但是对齐需要改进 digraph { rankdir=LR node [shape=record,weight=4] edge [weight=10000] X [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>Head"] A [label="<f3>•|<f4>4"] B [label="<f1>

我制作了一个有向图来绘制skiplist,它做得相当好,但是对齐需要改进

digraph {
  rankdir=LR
  node [shape=record,weight=4]
  edge [weight=10000]

  X [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>Head"]
  A [label="<f3>•|<f4>4"]
  B [label="<f1>•|<f2>•|<f3>•|<f4>8"]
  C [label="<f3>•|<f4>15"]
  D [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>16"]
  E [label="<f2>•|<f3>•|<f4>23"]
  F [label="<f2>•|<f3>•|<f4>42"]
  Y [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>Tail"]

  X:f0 -> D:f0
  X:f1 -> B:f1
  X:f2 -> B:f2
  X:f3 -> A:f3
  X:f4 -> A:f4

  A:f3 -> B:f3
  A:f4 -> B:f4

  B:f1 -> D:f1
  B:f2 -> D:f2
  B:f3 -> C:f3
  B:f4 -> C:f4

  C:f3 -> D:f3
  C:f4 -> D:f4

  D:f0 -> Y:f0
  D:f1 -> Y:f1
  D:f2 -> E:f2
  D:f3 -> E:f3
  D:f4 -> E:f4

  E:f3 -> F:f3
  E:f4 -> F:f4

  F:f2 -> Y:f2
  F:f3 -> Y:f3
  F:f4 -> Y:f4
}
有向图{
rankdir=LR
节点[形状=记录,重量=4]
边缘[重量=10000]
X[label=“•|•|•|•|•|头”]
A[label=“•| 4”]
B[label=“•|•|•|•| 8”]
C[label=“•| 15”]
D[label=“•|•|•|•|•| 16”]
E[label=“•|•| 23”]
F[label=“•|•| 42”]
Y[label=“•|•|•|•|•|尾”]
X:f0->D:f0
X:f1->B:f1
X:f2->B:f2
X:f3->A:f3
X:f4->A:f4
A:f3->B:f3
A:f4->B:f4
B:f1->D:f1
B:f2->D:f2
B:f3->C:f3
B:f4->C:f4
C:f3->D:f3
C:f4->D:f4
D:f0->Y:f0
D:f1->Y:f1
D:f2->E:f2
D:f3->E:f3
D:f4->E:f4
E:f3->F:f3
E:f4->F:f4
F:f2->Y:f2
F:f3->Y:f3
F:f4->Y:f4
}
这将产生:

我想制作更像这样的东西:


如何使边缘笔直?如何将所有节点对齐到同一基线上?

您需要调整每个节点的高度。以下是我到目前为止所做的工作,非常接近,但您可能需要进一步改进:

digraph so
{
  splines = line;
  rankdir = LR;
  node [ shape = record ];
  edge[ minlen = 2 ];

  X [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>Head", height = 5.5 ]
  A [label="<f3>•|<f4>4", height = 2.25 ]
  B [label="<f1>•|<f2>•|<f3>•|<f4>8", height = 4.5 ]
  C [label="<f3>•|<f4>15", height = 2.25 ]
  D [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>16", height = 5.5 ]
  E [label="<f2>•|<f3>•|<f4>23", height = 3.25 ]
  F [label="<f2>•|<f3>•|<f4>42", height = 3.25 ]
  Y [label="<f0>•|<f1>•|<f2>•|<f3>•|<f4>Tail", height = 5.5 ]

  X:f0 -> D:f0
  X:f1 -> B:f1
  X:f2 -> B:f2
  X:f3 -> A:f3:w
  X:f4 -> A:f4

  A:f3 -> B:f3
  A:f4 -> B:f4

  B:f1 -> D:f1
  B:f2 -> D:f2
  B:f3 -> C:f3
  B:f4 -> C:f4

  C:f3:e -> D:f3
  C:f4 -> D:f4

  D:f0 -> Y:f0
  D:f1 -> Y:f1
  D:f2 -> E:f2
  D:f3 -> E:f3
  D:f4 -> E:f4

  E:f3 -> F:f3
  E:f4 -> F:f4

  F:f2 -> Y:f2
  F:f3 -> Y:f3
  F:f4 -> Y:f4
}
有向图so
{
样条线=直线;
rankdir=LR;
节点[形状=记录];
边[minlen=2];
X[label=“•|•|•|•|•|头”,高度=5.5]
A[label=“•| 4”,高度=2.25]
B[label=“•|•|•|•| 8”,高度=4.5]
C[label=“•| 15”,高度=2.25]
D[label=“•|•|•|•|•| 16”,高度=5.5]
E[label=“•|•| 23”,高度=3.25]
F[label=“•|•| 42”,高度=3.25]
Y[label=“•|••|•|•|•|尾”,高度=5.5]
X:f0->D:f0
X:f1->B:f1
X:f2->B:f2
X:f3->A:f3:w
X:f4->A:f4
A:f3->B:f3
A:f4->B:f4
B:f1->D:f1
B:f2->D:f2
B:f3->C:f3
B:f4->C:f4
C:f3:e->D:f3
C:f4->D:f4
D:f0->Y:f0
D:f1->Y:f1
D:f2->E:f2
D:f3->E:f3
D:f4->E:f4
E:f3->F:f3
E:f4->F:f4
F:f2->Y:f2
F:f3->Y:f3
F:f4->Y:f4
}
屈服


对于此图表,只需将以下内容添加到图表中:

nodesep=0
(然后还可以删除
权重
属性)

:指定两个相邻节点之间的最小间距 同级


我想象它的工作方式是,nodesep在节点的两侧添加了一些填充。如果附近有一条边,节点将被移动以尊重填充。

Wow!为了我个人的利益,你能解释一下nodesep实际上做了什么吗?我看不到节点的距离(不是同一等级)和直线之间的联系。这种想法是有道理的,但同时
nodesep
对我来说会建议节点与顶部的箭头接触。奇怪,但效果很好,谢谢。@Drew
nodesep=0
会让他们触摸(几乎,取决于形状),至少是相同等级的人。在列组之间,
ranksep
确定距离。