Настроить диаграмму Санки в R - PullRequest
0 голосов
/ 04 сентября 2018

Используя sankeyNetwork() в пакете , я хочу немного настроить получившуюся диаграмму. Воспроизводимый код выглядит следующим образом:

library(networkD3)

links <- data.frame(source = c(0, 0, 0, 0, 0, 2, 2, 3, 3), target = c(1, 2, 3, 4, 5, 6, 7, 6, 7), value = c(70, 56.4, 48.7, 0.9, 338.8, 50.8, 5.6, 47.3, 1.4))
nodes <- data.frame(name = c("Cu in obsolete TVs", "Illegal export", " Domestic recycling", "Open burning", "Dumping landfill", "Reuse", "Material recovery", "Material loss"))

sankeyNetwork(Links=links, Nodes=nodes, Source='source', Target='target',
          Value='value', NodeID='name', fontSize=16, sinksRight = FALSE)

Я хочу настроить полученный график следующими способами:

  1. Я хочу переместить метку «Cu в устаревших телевизорах» слева от поля соответствующего узла.

  2. Я хочу удвоить ширину поля для повторного использования.

1 Ответ

0 голосов
/ 05 сентября 2018

Необходимые настройки невозможны при использовании встроенных опций networkD3, но вы можете достичь их с помощью onRender() для запуска пользовательского JavaScript при загрузке. Например (также увеличено правое поле в функции sankeyNetwork(), чтобы выравнивание по левому краю не было обрезано):

library(networkD3)
library(htmlwidgets)

links <- data.frame(source = c(0, 0, 0, 0, 0, 2, 2, 3, 3), target = c(1, 2, 3, 4, 5, 6, 7, 6, 7), value = c(70, 56.4, 48.7, 0.9, 338.8, 50.8, 5.6, 47.3, 1.4))
nodes <- data.frame(name = c("Cu in obsolete TVs", "Illegal export", " Domestic recycling", "Open burning", "Dumping landfill", "Reuse", "Material recovery", "Material loss"))
sn <- sankeyNetwork(Links=links, Nodes=nodes, Source='source', Target='target',
              Value='value', NodeID='name', fontSize=16, sinksRight = FALSE, 
              margin = list(right = 150))

onRender(sn,
  '
  function(el,x) {
    d3.select(el)
      .selectAll(".node text")
      .filter(function(d) { return d.name == "Cu in obsolete TVs"; })
      .attr("x", x.options.nodeWidth - 16)
      .attr("text-anchor", "end");

    d3
      .selectAll("rect")
      .filter(function (d, i) { return i === 5;})
      .attr("width", x.options.nodeWidth * 2);
  }
  '
)

enter image description here

...