GraphViz действительно не так сложно выучить. Основной язык действительно прост для такого рода графиков. Мне потребовалось всего несколько минут, чтобы воспроизвести (более или менее) первый пример из этого PDF-файла, и самое приятное в этом то, что благодаря своей простоте довольно просто генерировать графики процедурно из какого-то другого источника данных. *
Digraph fig1 {
rankdir = LR; //order things from left to right
//define alpha and beta as existing
α [shape=circle];
β [shape=circle];
//not strictly nescessary but helps if you want to
//assign them specific shapes or colours
subgraph cluster_M //names beginning with "cluster" get a box drawn, an odd hack
{
label = "M"
θ [shape=circle];
subgraph cluster_N
{
label = "N"
z [shape=circle];
w [shape=circle, style=filled]
z->w; //quite literally z points at w
}
θ -> z;
}
α -> θ;
β -> w;
}
составлено с
точка -Tpng input.txt -o graph.png
это выглядит так. Если важно иметь метки под пузырьками, вы можете сделать это с помощью пары дополнительных строк, аналогично, если важно конкретное расположение узлов, вы также можете это отрегулировать. Фактически, если вы не укажете формат изображения, поведение точки по умолчанию - вывод версии входного файла с координатами для позиции каждого элемента.
![The output image](https://i.stack.imgur.com/Uph2n.png)