Создавайте верхние метки для узлов с помощью графвиза (точка)

Мне нужно создать граф, представляющий расширяемую структуру хеширования. До сих пор мне удавалось создавать графики в graphviz (используя инструмент dot)... Однако у меня возникли проблемы с созданием верхних меток, представляющих количество битов для каждого сегмента... То, что я хочу сделать, похоже на это:

Расширяемая хеш-таблица в Википедии

Что я не могу сделать, так это маленькие 2 и 1, представляющие биты. Может ли кто-нибудь объяснить, как я буду это делать?

Мой график пока выглядит так:

digraph G {
nodesep = 0.5;
rankdir = LR;
node [shape=record];

node0[label = "<f0>0 | <f1>1"];
node1[label = "0010 | |", toplabel="1"];

subgraph cluster_0 {
    style=filled;
    color=white;
    node [style=filled,color=white];
    node0;
    label = "i = 1";
}

node0:f0->node1;}

результат


person J F    schedule 05.04.2011    source источник


Ответы (1)


Вы можете рассмотреть возможность использования HTML-подобных меток, если вам действительно необходимо сделать это с помощью graphviz. .

Я воссоздал упомянутый пример из википедии:

rankdir = LR;
node [shape=none];
splines=false;

n1[label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR>
 <TD CELLPADDING="2">2</TD>
 <TD BORDER="0"></TD>
</TR>
<TR><TD COLSPAN="2" PORT="port00"> 00 </TD></TR>
<TR><TD COLSPAN="2" PORT="port01"> 01 </TD></TR>
<TR><TD COLSPAN="2" PORT="port10"> 10 </TD></TR>
<TR><TD COLSPAN="2" PORT="port11"> 11 </TD></TR>
</TABLE>>];

a[label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR>
 <TD CELLPADDING="0" BORDER="0" COLSPAN="2">
  <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="2" FIXEDSIZE="TRUE" WIDTH="1" ALIGN="LEFT"><TR><TD>1</TD></TR></TABLE>
 </TD>
</TR>
<TR>
 <TD PORT="porta"> A </TD>
 <TD>k2</TD>
</TR>
</TABLE>>];

b[label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR>
 <TD CELLPADDING="2">2</TD>
 <TD BORDER="0" COLSPAN="2"></TD>
</TR>
<TR>
 <TD PORT="portb" COLSPAN="2"> B </TD>
 <TD>k1</TD>
</TR>
</TABLE>>];

c[label=<
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
<TR>
 <TD CELLPADDING="2">2</TD>
 <TD BORDER="0" COLSPAN="2"></TD>
</TR>
<TR>
 <TD PORT="portc" COLSPAN="2"> C </TD>
 <TD>k3</TD>
</TR>
</TABLE>>];

n1:port00 -> a:porta;
n1:port01 -> a:porta;
n1:port10 -> b:portb;
n1:port11 -> c:portc;

Как видите, код некрасивый... однако результат близок:

http://graph.gafol.net/evEKgxwgj

вывод графвиза

Обратите внимание, что для демонстрационных целей существует вариант верхней метки — узел a использует вложенную таблицу.

person marapet    schedule 06.04.2011
comment
Следует добавить, что сами разработчики графвиза предпочитают html-подобные таблицы, а не используют устаревший API записи. - person Ricardo Magalhães Cruz; 03.11.2015