首页 > 解决方案 > 在 R 中创建具有集节点位置和集中边的网络图,同时带有圆头和箭头

问题描述

我一直在尝试找到一种方法来使用 DiagrammeR/GraphViz 在 R 中复制以下网络图格式,但没有成功(忽略 N1 上的黑色粗箭头):https://i.stack.imgur.com/oHpQz。 PNG

该图是一个有向图,如果边值为正,则某个方向上的每条边都以箭头 (-->) 结尾,如果边值为负,则以圆/点 (--o) 结尾。在一对节点(例如 N1 -- A1)之间,可以有一条边 N1 --> A1 和一条边 A1 --o N1,这些需要集中起来,使两条边看起来像一条带一端为箭头,另一端为圆头(如:o--->)。这些不能是平行的,也不能在理想情况下看起来像两条边。

另一个要求是节点必须位于非常特定的位置,并且在边缘可能发生变化的整个模型模拟中始终保持在那里。根据我的尝试和我阅读的文档,这不可能以 DOT 格式执行,但可以使用 neoto 格式。

这是我遇到问题的地方。在neato 中,我可以通过定义节点的x、y 位置将节点精确地对齐到我想要的位置。但是,当我使用 concent = true 从两个平行的边缘创建 o---> 边缘时,只剩下一种类型的箭头。因此,应该看起来像 o---> 的边缘最终看起来像 ---> 或 o---。

这在 DOT 格式中不是问题,因为 concent = true 可以满足我的要求,但在 DOT 中我无法分配确切的节点位置。我尝试过使用节点等级来解决这个问题,但运气不佳。似乎将我想要的节点堆叠在同一等级内的不同等级中。同样,concentrate = true 似乎不适用于同一等级内的节点之间的边缘,因为它将它们作为两个单独的弯曲边缘 ---> 和 o--- 而不集中它们。

我需要这个工作的原因是因为我正在运行边缘发生变化的模型模拟,并且我需要生成数百个这样的图表。为了便于比较,节点需要保持在同一位置以保持一致性。

这是我使用neato格式所能想到的最接近的格式(节点以我想要的方式定位,但它没有显示正确的o--->所有黑色边缘减去自身边缘;红色边缘是真正的单向链接) : https://i.stack.imgur.com/YJBY7.jpg

如果只有边缘显示为正确的 o---> 格式,这将非常适合我的需要。如果您知道使用 DiagrammeR/GraphViz 甚至其他程序解决此问题的任何方法,我将不胜感激。谢谢!

标签: rdotdiagrammerneator-graphviz

解决方案


你可能不需要专心。查看箭头目录https://www.graphviz.org/doc/info/attrs.html#d:arrowtailhttps://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]
}

给予: 在此处输入图像描述


推荐阅读