【问题标题】:Is there a way to visualize a partially directed graph using R forceNetwork() function?有没有办法使用 R forceNetwork() 函数来可视化部分有向图?
【发布时间】:2021-12-28 05:52:38
【问题描述】:

我目前正在使用 networkD3 包的 R forceNetwork 函数,并且我已经正确验证了我的图表的节点和链接数据帧的正确性。

我的节点数据框(node_df)是这样的:

   node_id  node_type node_size
0  T054717 irrelevant        10
1  T095006 irrelevant        10
2  T088658 irrelevant        10
3  T069179 irrelevant        10
4  T009515 irrelevant        10
5  T152167 irrelevant        10
6  T100447 irrelevant        10
7  T150659 irrelevant        10
...

我的链接数据框(links_df)是这样的:

    tid1 tid2 edge_dir
0     37   36       10
1     37    0       10
2     37    1       10
3     37    3       10
...
147   34   35        5
148    7   47        5
149   34   47        5
150   35   47        5
151   36   48        5
152    1   48        5

我这样设置 forceNetwork 函数:

network <- forceNetwork (Links = links_df,
                           Nodes = node_df,
                           Source = "tid1",
                           Target = "tid2",
                           Value = "edge_dir",
                           NodeID = "node_id",
                           Nodesize = "node_size",
                           Group = "node_type",
                           colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"),
                           fontSize = 10,
                           linkDistance = 100,
                           radiusCalculation = JS(" Math.sqrt(d.nodesize)+6"), 
                           charge = -30,
                           linkColour = ifelse(links_df$edge_dir == 10, "black","red"),
                           opacity = 1,
                           zoom = TRUE,
                           arrows = ifelse(links_df$edge_dir == 10, TRUE, FALSE),
                           opacityNoHover = TRUE,
                           clickAction = NULL)

我正在为函数的 arrows 参数苦苦挣扎。事实上,我想通过检查 Value 参数来指定每个链接是否应该有有向边(箭头 = TRUE)或无向边(箭头 = FALSE)。

在我的例子中,Value 是指名为 edge_dir 的 Links 数据框的一列,它指定边是否应该定向(edge_dir = 10)或不定向(edge_dir = 5)。

查看此 stackoverflow 链接后,specify-colors-for-each-link-in-a-force-directed-network-networkd3

我试过这样设置参数: arrows = ifelse(links_df$edge_dir == 10, TRUE, FALSE) 但输出图有箭头,那里应该有无向线。

linkColour 参数中使用相同的结构:linkColour = ifelse(links_df$edge_dir == 10, "black","red") 它工作正常,有向边是黑色的,而那些应该是无向的,但它们不是,是红色的,如图所示这个graph output image

是否可以通过修改 arrows 参数来显示具有有向和无向边的图形? 谢谢!

【问题讨论】:

  • 由于您没有提供任何数据,您应该使用您链接到的页面上的示例进行尝试。它有一个可接受的答案,并允许我们查看结果。我们无法看到您的数据会发生什么,因为我们不在您身边。 (接受答案的示例输出中没有箭头。)
  • 我听从了您的建议@IRTFM,并尝试了 forceNetwork 函数 [stackoverflow.com/a/39782310/6304083] 接受的答案代码,并添加了 arrows = ifelse(MisLinks$value &gt; 1, TRUE, FALSE)。输出图的每条边现在都有一个箭头,即使 value
  • arrows 参数只是一个允许显示箭头的标志。它不是每个链接向量。我认为您应该修改您的 Value 参数。我认为这是与stackoverflow.com/questions/51024363/… BTW 的重复,即使它是重复的,我也要感谢您提出这个问题,因为我以前从未见过这种结构,而且它看起来很迷人。
  • 这能回答你的问题吗? forceNetwork networkD3 - Arrow issue
  • arrow 参数是全有或全无。要为每个链接打开或关闭箭头,您必须修改底层 JavaScript。

标签: r networkd3


【解决方案1】:

这是一个不完美的解决方案,但它比自己对底层 JavaScript 进行大量修改要容易。您可以使用 htmlwidgets::onRender() 注入一些 JavaScript,以便在生成绘图后立即运行。这是一个示例,说明如何仅对值等于 5 的链接关闭箭头...

library(tibble)
library(networkD3)
library(htmlwidgets)

node_df <- tibble::tribble(
  ~node_id,  ~node_type,   ~node_size, ~directed,
  "T054717", "irrelevant", 10,       TRUE,
  "T095006", "irrelevant", 10,       FALSE,
  "T088658", "irrelevant", 10,       TRUE,
  "T069179", "irrelevant", 10,       FALSE,
  "T009515", "irrelevant", 10,       TRUE,
  "T152167", "irrelevant", 10,       FALSE,
  "T100447", "irrelevant", 10,       TRUE,
  "T150659", "irrelevant", 10,       FALSE
  )

links_df <- tibble::tribble(
  ~tid1, ~tid2, ~edge_dir,
  0,     1,     10,
  0,     2,     10,
  0,     3,     10,
  1,     3,     10,
  2,     4,     5,
  2,     5,     5,
  3,     6,     5,
  4,     5,     5,
  5,     6,     5,
  5,     6,     5
  )

network <- forceNetwork (Links = links_df,
                         Nodes = node_df,
                         Source = "tid1",
                         Target = "tid2",
                         Value = "edge_dir",
                         NodeID = "node_id",
                         Nodesize = "node_size",
                         Group = "node_type",
                         colourScale = JS("d3.scaleOrdinal(d3.schemeCategory20);"),
                         fontSize = 10,
                         linkDistance = 100,
                         radiusCalculation = JS(" Math.sqrt(d.nodesize)+6"),
                         charge = -30,
                         linkColour = ifelse(links_df$edge_dir == 10, "black","red"),
                         opacity = 1,
                         zoom = TRUE,
                         arrows = ifelse(links_df$edge_dir == 10, TRUE, FALSE),
                         opacityNoHover = TRUE,
                         clickAction = NULL)

htmlwidgets::onRender(network, '
  function(el) {
    d3.select("svg")
      .selectAll(".link")
      .filter(function(d) { return d.value == 5; })
      .style("marker-end", null);
  }')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多