Как установить linkdistance в forcenetwork в R?

Я пытаюсь использовать forceNetwork в пакете networkd3. Я хочу определить 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; }")

or

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

person HYljy    schedule 12.02.2020    source источник


Ответы (1)


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

введите здесь описание изображения

person CJ Yetman    schedule 21.02.2020