Цвет пользовательского узла R networkD3 для radioNetwork()

Пакет R networkD3 предоставляет пользователям R интерфейс для создания сетевых графиков в D3, но входные данные и возможность сопоставления данных с сетевой эстетикой различаются в зависимости от доступных графиков (например, simpleNetwork, forceNetwork).

Недавно я пытался применить пользовательские цвета к каждому узлу в radioNetwork(), подобно этот поток, но я не могу понять, как пользовательская окраска была сопоставлена ​​с узлами.

Код для создания пользовательской окраски:

library(networkD3)
library(tidyverse)
library(data.tree)

## Data
input <- list(number=50)
Data_tree <- data.frame(Start="Class",
                      Asset = sample(c("FI","Equity","Currency","Commodities"),input$number,replace = TRUE),
                      Sub_Asset = sample(c("Asia","Europe","USA","Africa","ME"),input$number,replace = TRUE),
                      Ticker = replicate(input$number,paste0(sample(LETTERS,3),collapse=""))) %>% 
unite(col="pathString",Start,Asset,Sub_Asset,Ticker,sep="-",remove=FALSE) %>%
select(-Start) %>% as.Node(pathDelimiter = "-")



colorVector <- c("black", "red", "blue", "green", "orange", 
rep("red", 5), rep("blue", 5), rep("green", 4), rep("orange", 4),
rep("red", 11), rep("blue", 14), rep("green", 14), rep("orange", 11))

jsarray <- paste0('["', paste(colorVector, collapse = '", "'), '"]')
nodeStrokeJS <- JS(paste0('function(d, i) { return ', jsarray, '[i]; }'))

radialNetwork(ToListExplicit(Data_tree, unname = TRUE ), 
    linkColour = "#ccc",
    nodeColour = "#fff",
    nodeStroke = nodeStrokeJS,
    textColour = "#cccccc")

Я бы сказал, что этот пример несколько неполный, поскольку в нем не объясняется, как цвета сопоставляются с узлами (через вывод списка ToListExplicit или data_tree? Мне не удалось найти подходящую длину), особенно поскольку добавление дополнительных элементов в colorVector не нарушает сценарий. Так как же пользовательские цвета реализованы во входных данных для radioNetwork()?


person mbcaradima    schedule 26.02.2018    source источник


Ответы (2)


В вашем примере узлы упорядочены по уровню, а затем по тому, как они упорядочены в исходных данных. Так...

  1. Класс (высший уровень)
  2. Капитал (2-й уровень)
  3. Валюта (2-й уровень)
  4. Товары (2-й уровень)
  5. ФИ (2-й уровень)
  6. США (3-й уровень)
  7. Азия (3-й уровень)
  8. и т. д.

Если ваша цветовая палитра недостаточно длинна, чтобы соответствовать каждому из ваших узлов, она вернется к началу (так же, как это делает R, когда вы комбинируете векторы разной длины, например paste(c("node1","node2","node3"), c("d", "e")))

person CJ Yetman    schedule 26.02.2018

Итак, я поторопился, опубликовав это слишком рано. Одним из решений является преобразование data.tree в data.frame, а затем построение вектора с длиной и порядком, которые соответствуют узлам/строкам в data.frame (поскольку data.frame дает столбец to/from/name схема):

tree.df <- ToDataFrameNetwork(tree, "name")
colorVector <- rep("red", nrow(tree.df))
jsarray <- paste0('["', paste(colorVector, collapse = '", "'), '"]')
nodeStrokeJS <- JS(paste0('function(d, i) { return ', jsarray, '[i]; }'))

radialNetwork(ToListExplicit(Data_tree, unname = TRUE ), 
    linkColour = "#ccc",
    nodeColour = "#fff",
    nodeStroke = nodeStrokeJS,
    textColour = "#cccccc")
person mbcaradima    schedule 26.02.2018