Создание сетевого графа с заданными положениями узлов и концентрированными ребрами с остриями кружков и стрелок в R
Я пытался найти способ воспроизвести следующий формат сетевого графа в R с помощью DiagrammeR/GraphViz, но безуспешно (не обращайте внимания на толстую черную стрелку на N1): https://stackru.com/images/2ae4ec773d4a4b2ab4c8cf273a91738bd5944c0b.png
Граф является ориентированным графом, и каждое ребро в определенном направлении заканчивается либо стрелкой (->), если значение ребра положительное, либо кружком / точкой (--o), если значение ребра отрицательное. Между парой узлов (например, N1 - A1) может быть ребро N1 -> A1 и ребро A1 --o N1, и их нужно сконцентрировать так, чтобы два ребра выглядели как одна линия с острие стрелки на одном конце и кружок на противоположном конце (вот так: o--->). В идеале они не могут быть параллельны или выглядеть как два края.
Другое требование состоит в том, что узлы должны находиться в очень определенных положениях и оставаться там во время моделирования модели, где края могут изменяться. Из того, что я пробовал, и из документации, которую я прочитал, это невозможно сделать в формате DOT, но возможно в формате neato.
Вот где у меня проблема. В чистом виде я могу выровнять узлы именно там, где я хочу, определив их позиции x, y. Однако, когда я использую концентрат = true для создания края o ---> из двух параллельных ребер, остается только один тип наконечника стрелки. Таким образом, край, который должен выглядеть как o --->, в конечном итоге выглядит как ---> или o ---.
Это не проблема в формате DOT, поскольку convert = true выполняет то, что я хочу, но в DOT я не могу назначать точные позиции узлов. Я пытался обойти это, используя ранги узлов, но без особого успеха. Кажется, что я хочу складывать узлы в разные ранги в одном и том же ранге. Кроме того, похоже, что convert = true не работает для ребер между узлами одного ранга, поскольку оставляет их как два отдельных изогнутых ребра ---> и o --- без их концентрации.
Причина, по которой мне это нужно для работы, заключается в том, что я запускаю моделирование, в котором меняются края, и мне нужно создать сотни таких графиков. Для удобства сравнения узлы должны оставаться в одном месте для единообразия.
Это самое близкое, что я мог придумать, используя формат neato (узлы расположены так, как я хочу, но он не показывает правильного o ---> для всех черных краев за вычетом собственных краев; красные края являются истинными односторонними ссылками): https://stackru.com/images/e8eb7fb4f4cd8a6f395b528e670fb98d9b536c51.jpg
Если бы только края отображались в правильном формате o --->, это было бы идеально для моих нужд. Если вы знаете какой-либо способ решить эту проблему с помощью DiagrammeR/GraphViz или даже другой программы, я был бы очень благодарен. Спасибо!
1 ответ
Скорее всего, вам не нужно концентрироваться . Посмотрите на arrowtail и dir ( https://www.graphviz.org/doc/info/attrs.html#d:arrowtail и https://www.graphviz.org/doc/info/attrs.html#d:dir ) и аккуратно -n
digraph c {
graph[label="can neato do the work?"]
node[shape=circle]
a [pos="100,100"]
b [pos="200,100"]
c [pos="300,100"]
a->b [dir=both arrowtail=odot]
c->c [dir=both arrowtail=odot arrowhead=none]
}