使用 R 中的圆头和箭头创建具有设置节点位置和集中边的网络图
Creating a network graph with set node positions and concentrated edges with both circleheads and arrowheads in R
我一直在尝试找到一种方法来使用 DiagrammeR/GraphViz 在 R 中复制以下网络图格式,但没有成功(忽略 N1 上的粗黑箭头):https://i.stack.imgur.com/oHpQz.png
该图是有向图,如果边值为正,则某个方向上的每条边都以箭头 (-->) 结尾,如果边为 circle/odot (--o)值为负。在一对节点(例如 N1 -- A1)之间,可以有一条边 N1 --> A1 和一条边 A1 --o N1,这些需要集中,以便两条边看起来像一条线一端有箭头,另一端有圆头(像这样:o--->)。理想情况下,它们不能平行或看起来像两条边。
另一个要求是节点必须位于非常特定的位置,并在边缘可能发生变化的整个模型模拟过程中保持在那里。根据我的尝试和阅读的文档,这不可能以 DOT 格式进行,但可以以 neato 格式进行。
这是我遇到问题的地方。在 neato 中,我可以通过定义节点的 x、y 位置来将节点准确地对齐到我想要的位置。但是,当我使用 concentrate = true 从两个平行边创建 o---> 边时,只剩下一种类型的箭头。所以应该看起来像 o---> 的边最终看起来像 ---> 或 o---。
这在 DOT 格式中不是问题,因为 concentrate = true 做了我想要它做的事情,但在 DOT 中我无法分配准确的节点位置。我曾尝试使用节点等级来解决这个问题,但运气不佳。它似乎将我想要的节点堆叠在同一等级的不同等级中。同样,concentrate = true 似乎不适用于同一等级内节点之间的边,因为它将它们保留为两个单独的弯曲边 ---> 和 o--- 而不集中它们。
我之所以需要它来工作,是因为我正在 运行 边缘变化的模型模拟,我需要生成数百个这样的图表。为了便于比较,节点需要保持在同一位置以保持一致性。
这是我使用 neato 格式所能想到的最接近的格式(节点按我想要的方式定位,但它没有显示正确的 o---> 所有黑色边缘减去自身边缘;红色边缘是真实的单向链接):https://i.stack.imgur.com/YJBY7.jpg
如果只有边缘显示为正确的 o---> 格式,这将非常适合我的需要。如果您知道使用 DiagrammeR/GraphViz 或其他程序解决此问题的任何方法,我将不胜感激。谢谢!
你可能不需要集中注意力。查看 arrowtail 和 dir (https://www.graphviz.org/doc/info/attrs.html#d:arrowtail and https://www.graphviz.org/doc/info/attrs.html#d:dir) 和 neato -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]
}
给予:
我一直在尝试找到一种方法来使用 DiagrammeR/GraphViz 在 R 中复制以下网络图格式,但没有成功(忽略 N1 上的粗黑箭头):https://i.stack.imgur.com/oHpQz.png
该图是有向图,如果边值为正,则某个方向上的每条边都以箭头 (-->) 结尾,如果边为 circle/odot (--o)值为负。在一对节点(例如 N1 -- A1)之间,可以有一条边 N1 --> A1 和一条边 A1 --o N1,这些需要集中,以便两条边看起来像一条线一端有箭头,另一端有圆头(像这样:o--->)。理想情况下,它们不能平行或看起来像两条边。
另一个要求是节点必须位于非常特定的位置,并在边缘可能发生变化的整个模型模拟过程中保持在那里。根据我的尝试和阅读的文档,这不可能以 DOT 格式进行,但可以以 neato 格式进行。
这是我遇到问题的地方。在 neato 中,我可以通过定义节点的 x、y 位置来将节点准确地对齐到我想要的位置。但是,当我使用 concentrate = true 从两个平行边创建 o---> 边时,只剩下一种类型的箭头。所以应该看起来像 o---> 的边最终看起来像 ---> 或 o---。
这在 DOT 格式中不是问题,因为 concentrate = true 做了我想要它做的事情,但在 DOT 中我无法分配准确的节点位置。我曾尝试使用节点等级来解决这个问题,但运气不佳。它似乎将我想要的节点堆叠在同一等级的不同等级中。同样,concentrate = true 似乎不适用于同一等级内节点之间的边,因为它将它们保留为两个单独的弯曲边 ---> 和 o--- 而不集中它们。
我之所以需要它来工作,是因为我正在 运行 边缘变化的模型模拟,我需要生成数百个这样的图表。为了便于比较,节点需要保持在同一位置以保持一致性。
这是我使用 neato 格式所能想到的最接近的格式(节点按我想要的方式定位,但它没有显示正确的 o---> 所有黑色边缘减去自身边缘;红色边缘是真实的单向链接):https://i.stack.imgur.com/YJBY7.jpg
如果只有边缘显示为正确的 o---> 格式,这将非常适合我的需要。如果您知道使用 DiagrammeR/GraphViz 或其他程序解决此问题的任何方法,我将不胜感激。谢谢!
你可能不需要集中注意力。查看 arrowtail 和 dir (https://www.graphviz.org/doc/info/attrs.html#d:arrowtail and https://www.graphviz.org/doc/info/attrs.html#d:dir) 和 neato -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]
}
给予: