Как я могу установить расстояние соединения в forcenetwork в R? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь использовать forceNetwork в пакете . Я хочу определить linkDistance, чтобы установить определенное расстояние для каждого узла. Но у меня есть проблема ( так же, как этот вопрос ). Ответ там не решает мою проблему.

Вот мой пример данных и код.

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

##Data
link_df <-
  tibble::tribble(
   ~source, ~target, ~weight,   ~source_idx, ~target_idx, ~linkdist,
   "great", "great", 1.0000000, 0,           0,          10.000000,
   "good",  "great", 0.7036672, 1,           0,          7.036672,
   "best",  "great", 0.3486529, 2,           0,          3.486529,
   "win",   "great", 0.2147706, 3,           0,          2.147706
  )

node_df <-
  tibble::tribble(
    ~node,    ~degree,   ~sent, ~node_size,
    "great",    0.6817043, "A",   64.789598,
    "good", 0.5037594, "A",   19.320302,
    "best", 0.4761905, "B",   15.425671,
    "win",  0.6190476, "C",   44.057260
  )

##Code
ColourScale <- 'd3.scaleOrdinal()
    .domain(["A", "B", "C", "D"])
   .range(["#ffdd00", "#ff0000", "#0004ff", "#9500ff"]);'

forceNetwork(Links = link_df, Nodes = node_df, 
             Source = 'source_idx', Target = 'target_idx', 
             NodeID = 'node', Group = 'sent',
             Nodesize = 'node_size', 
             bounded = TRUE, opacityNoHover = TRUE, zoom = TRUE,
             colourScale = JS(ColourScale),
             legend = TRUE,
             fontFamily = "Calibri",
             fontSize = 20,
             charge = -400,
             opacity = 0.8)

Я пытаюсь это сделать. Но это не решило.

linkDistance = networkD3::JS("function(d) { return 5*d.linkdist; }")

или

linkDistance=JS('function(d) {', 'return d.linkdist;', '}')

1 Ответ

0 голосов
/ 21 февраля 2020

networkD3 передает только необходимые столбцы фрейма данных ваших ссылок в htmlwidget, который он создает, поэтому d.linkdist не существует в данных, которые JavaScript использует. Вы можете добавить нужные столбцы к данным в htmlwidget перед его запуском, и тогда ваш пользовательский JavaScript будет работать ... (Мне пришлось изменить ваш пример, чтобы он был воспроизводимым) ...

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

##Data
link_df <-
  tibble::tribble(
   ~source, ~target, ~weight,   ~source_idx, ~target_idx, ~linkdist,
   "great", "great", 1.0000000, 0,           0,          10.000000,
   "good",  "great", 0.7036672, 1,           0,          7.036672,
   "best",  "great", 0.3486529, 2,           0,          3.486529,
   "win",   "great", 0.2147706, 3,           0,          2.147706
  )

node_df <-
  tibble::tribble(
    ~node,    ~degree,   ~sent, ~node_size,
    "great",    0.6817043, "A",   64.789598,
    "good", 0.5037594, "A",   19.320302,
    "best", 0.4761905, "B",   15.425671,
    "win",  0.6190476, "C",   44.057260
  )

##Code
ColourScale <- 'd3.scaleOrdinal()
    .domain(["A", "B", "C", "D"])
   .range(["#ffdd00", "#ff0000", "#0004ff", "#9500ff"]);'

fn <- forceNetwork(Links = link_df, Nodes = node_df, 
             Source = 'source_idx', Target = 'target_idx', 
             NodeID = 'node', Group = 'sent',
             Nodesize = 'node_size', 
             bounded = TRUE, opacityNoHover = TRUE, zoom = TRUE,
             colourScale = JS(ColourScale),
             legend = TRUE,
             fontFamily = "Calibri",
             fontSize = 20,
             charge = -400,
             opacity = 0.8,
             linkDistance=JS('function(d) {', 'return d.linkdist;', '}'))

fn$x$links$linkdist <- link_df$linkdist
fn

enter image description here

...