R networkD3 diagonalNetwork окраска листовых узлов - PullRequest
0 голосов
/ 25 сентября 2018

Описание проблемы
У меня есть фрейм данных, который будет кластеризован, и фрейм данных, определяющий цвета узлов, например:

# DATA
color.df <- data.frame(
  name = c('node1',"node2","node3"),
  color = c('green','red','blue')
)

data.df <- t(data.frame(
  node1 = c(1,2,3,5),
  node2 = c(4,5,3,5),
  node3 = c(3,3,2,1)
))

Затем я применяюиерархическая кластеризация и преобразование ее в радиальную сеть:

# CLUSTERING
distance.mat <- dist(data.df)
hc <- hclust(distance.mat)
rad <- as.radialNetwork(hc, '')
diagonalNetwork(List = rad)

Теперь я хочу раскрасить узлы в соответствии с color.df, это выполнимо, когда известны все цвета узлов (как ответили * 1013)* здесь ), однако это становится сложнее, так как должны быть окрашены только листья (очевидно, моя сеть намного сложнее, чем этот пример).

То, что я пробовал
Iдумаю, что путь состоит в том, чтобы сопоставить имя узла с цветом, используя JS следующим образом:

function test(d, i)  { return { "node1" : "green", "node2" : "red", "node3" : "blue" }[d] }
test("node1")

Я пытался реализовать это в R:

w <- paste('{', paste(color.df %>% 
                        mutate(name = paste0('"', name), color = paste0(color, '"')) %>%
                        unite('x', c(name, color), sep = '" : "' ) %>%
                        .$x, collapse= ', '), '}', collapse = '') 

node.col.func <- JS(paste0('function(d, i) { return ', w, '[d.name]; }'))
rad <- as.radialNetwork(hc, '')
dn <- diagonalNetwork(List = rad, nodeColour = node.col.func)

Это не работает, однакосам код работает, так как я жестко его кодирую, узлы окрашиваются:

node.col.func <- JS(paste0('function(d, i) { return ', w, '["node1"]; }'))

Если я использую alert *, то 1029 * вернет 'undefined', поэтому, очевидно, я не могу получить доступ к имени узла здесь.

1 Ответ

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

После некоторого недоумения я обнаружил, что мне нужно получить доступ к имени узла через d.data.name вместо d.name.Поэтому строку:

node.col.func <- JS(paste0('function(d, i) { return ', w, '[d.name]; }'))

следует заменить на:

node.col.func <- JS(paste0('function(d, i) { return ', w, '[d.data.name]; }'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...