Как создать диаграмму Санки с автореференциями и циклическими ссылками, используя библиотеку NetworkD3 R - PullRequest
0 голосов
/ 06 марта 2019

У меня есть эти данные:

list(nodes = structure(list(name = c(NA, NA, "1.1.1. Formação Florestal", 
"1.1.2. Formação Savanica", NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, "3.1. Pastagem", NA, NA, NA, "3.2.1. Cultura Anual e Perene", 
NA, "3.3. Mosaico de Agricultura e Pastagem", NA, NA, "4.2. Infraestrutura Urbana", 
"4.5. Outra Área não Vegetada", NA, NA, NA, NA, NA, NA, NA, "5.1 Rio ou Lago ou Oceano"
)), class = "data.frame", row.names = c(NA, -33L)), links = structure(list(
    source = c(3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 15L, 15L, 
    15L, 15L, 15L, 15L, 15L, 19L, 19L, 19L, 19L, 21L, 21L, 21L, 
    21L, 21L, 21L, 24L, 25L, 25L, 25L, 33L), target = c(3L, 21L, 
    4L, 21L, 15L, 3L, 25L, 4L, 33L, 19L, 15L, 21L, 3L, 25L, 4L, 
    33L, 15L, 19L, 4L, 21L, 4L, 21L, 25L, 33L, 15L, 3L, 4L, 25L, 
    4L, 33L, 33L), value = c(0.544859347827813, 0.00354385993588971, 
    0.494359662221154, 4.67602736159475, 2.20248911690968, 0.501437742068369, 
    0.00354375594818463, 24.8427814053755, 0.439418727642527, 
    0.0079740332093807, 11.8060486886398, 2.76329829691466, 0.000886029792298199, 
    0.00177186270758855, 3.35504921147758, 0.14263144351167, 
    1.12170804870686, 0.0478454594554582, 0.217079959877658, 
    0.00620223918980076, 1.79754946594068, 9.02868098124075, 
    0.00442981113709027, 0.242743895018645, 0.498770814980772, 
    0.00265782877794886, 0.000885894856554407, 0.379188333632346, 
    0.00265793188317263, 0.00265771537700804, 0.39158027235054
    )), row.names = c(NA, -31L), class = "data.frame"))

, и я пытаюсь создать диаграмму Санки, используя пакет networkD3 с этим простым кодом:

sankeyNetwork(Links = landuse$links, Nodes = landuse$nodes, Source = "source",
              Target = "target", Value = "value", NodeID = "name",
              units = "km²", fontSize = 12, nodeWidth = 30)

Я получил этосообщение:

Warning message:
It looks like Source/Target is not zero-indexed. This is required in JavaScript and so your plot may not render.

Но даже если я проиндексировал цель / источник на ноль, в dev ничего не воспроизводится.У меня есть данные в том же формате, как в этом примере , поэтому я хотел бы знать возможную проблему.

РЕДАКТИРОВАТЬ:

Iесть автореференции и циркулярные ссылки.Можно ли сделать диаграмму с данными этого типа, используя пакет?

Ответы [ 2 ]

1 голос
/ 20 мая 2019

На основании примера, на который вы указали ссылку в одном из ваших комментариев ( здесь ), вы на самом деле не хотите автоматических и циклических ссылок, но вместо этого вам нужны два отдельных узла для каждой вещи.один для левого столбца и один для правого столбца (например, «Formação Florestal» в левом столбце / 1985 г. и «Formação Florestal» в правом столбце / 2017 г.).

Этого можно добиться с помощью данныхВы обеспечили различие между исходным и целевым узлами, которые имеют тот же индекс, что и отдельные узлы, например ...

landuse <- list(
  nodes = data.frame(
    name = c(
      NA, NA, "1.1.1. Formação Florestal", "1.1.2. Formação Savanica", NA, NA,
      NA, NA, NA, NA, NA, NA, NA, NA, "3.1. Pastagem", NA, NA, NA, 
      "3.2.1. Cultura Anual e Perene", NA, 
      "3.3. Mosaico de Agricultura e Pastagem", NA, NA, 
      "4.2. Infraestrutura Urbana", "4.5. Outra Área não Vegetada", NA, NA, NA,
      NA, NA, NA, NA,"5.1 Rio ou Lago ou Oceano"
    ),
    stringsAsFactors = FALSE
  ),
  links = data.frame(
    source = c(
      3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 
      19L, 19L, 19L, 19L, 21L, 21L, 21L, 21L, 21L, 21L, 24L, 25L, 25L, 25L, 33L
    ),
    target = c(
      3L, 21L, 4L, 21L, 15L, 3L, 25L, 4L, 33L, 19L, 15L, 21L, 3L, 25L, 4L, 33L,
      15L, 19L, 4L, 21L, 4L, 21L, 25L, 33L, 15L, 3L, 4L, 25L, 4L, 33L,33L
    ),
    value = c(
      0.544859347827813, 0.00354385993588971, 0.494359662221154, 
      4.67602736159475, 2.20248911690968, 0.501437742068369,
      0.00354375594818463, 24.8427814053755, 0.439418727642527,
      0.0079740332093807, 11.8060486886398, 2.76329829691466,
      0.000886029792298199, 0.00177186270758855, 3.35504921147758,
      0.14263144351167, 1.12170804870686, 0.0478454594554582,
      0.217079959877658, 0.00620223918980076, 1.79754946594068,
      9.02868098124075, 0.00442981113709027, 0.242743895018645,
      0.498770814980772, 0.00265782877794886, 0.000885894856554407,
      0.379188333632346, 0.00265793188317263, 0.00265771537700804,
      0.39158027235054
    ),
    stringsAsFactors = FALSE
  )
)

# create a links data frame where the right and left column versions of each node
# are distinguishble
links <- 
  data.frame(source = paste0(landuse$nodes$name[landuse$links$source], " (1985)"),
             target = paste0(landuse$nodes$name[landuse$links$target], " (2017)"),
             value = landuse$links$value,
             stringsAsFactors = FALSE)

# build a nodes data frame from the new links data frame
nodes <- data.frame(name = unique(c(links$source, links$target)), 
                    stringsAsFactors = FALSE)

# change the source and target variables to be the zero-indexed position of
# each node in the new nodes data frame
links$source <- match(links$source, nodes$name) - 1
links$target <- match(links$target, nodes$name) - 1

# remove the year indicator from the node names
nodes$name <- substring(nodes$name, 1, nchar(nodes$name) - 7)

# plot it
library(networkD3)
sankeyNetwork(Links = links, Nodes = nodes, Source = "source",
              Target = "target", Value = "value", NodeID = "name",
              units = "km²", fontSize = 12, nodeWidth = 30)

enter image description here

1 голос
/ 06 марта 2019

Ну, из-за того, как он построен sankeyNetwork, вам нужно начать с 0 в вашем links. Как видно из landuse, ваши данные начинаются с 3.

Вы можете переиндексировать ссылку, чтобы начать с 0:

landuse$links$source <- landuse$links$source-3
landuse$links$target <- landuse$links$target-3
sankeyNetwork(Links = landuse$links, Nodes = landuse$nodes, Source = "source",
               Target = "target", Value = "value", NodeID = "name",
               units = "km²", fontSize = 12, nodeWidth = 30)

Конечно, это выглядит не так красиво, как санки, на которую вы ссылаетесь в своем вопросе. Зачем? Из-за ваших данных

  1. У вас есть "автореференции": ссылки, где источник и цель - это один и тот же узел. Это порождает странные полукруги, начинающиеся и заканчивающиеся в одном и том же узле
  2. У вас есть «циклические ссылки»: ссылки, по которым источник «X» направляется к «Y», источник «Y» направляется к «Z», а затем источник «Z» направляется к «Z». Это генерирует эти странные кривые
  3. У некоторых из вас значения на несколько порядков меньше, чем у других, поэтому эти малыши плохо визуализируются.

Тебе, возможно, понадобится проверка твоих данных:

  1. Вы действительно заинтересованы в "автореференциях"? Если нет, удалите их
  2. Вас устраивают циклические ссылки или вы предпочитаете дублировать узлы, чтобы показать линейный санкей?
  3. Вас интересует показ очень маленьких узлов? Если нет, удалите их
...