2016-08-02 7 views
1

Я использую библиотеку networkD3 для R, чтобы создать сети Sankey. Хотя для меня это работает очень хорошо, я столкнулся с проблемой присвоения атрибутов «NoteID» и/или «NoteGroup» для группировки и выделения цветов, как показано в https://christophergandrud.github.io/networkD3/#sankeySankey Diagram with R library networkD3 не отображает цвета

В следующем примере показаны четыре примера создания Sankey схема, только «Sankey4» работает как задумано, то есть без каких-либо цветов:

library(networkD3) 
#Unique list of nodes 
my_nodes = structure(list(name = c("HawaiTEST", "AMSVOASMPP01", "App1", 
            "Transfer", "Transferred_tel__63null_", 
            "Transferred_tel__631100107_", 
            "AMSVOASMPP02", 
            "Transferred_tel__631100108_", 
            "Transferred_tel__631100106_", 
            "Transferred_tel__631100104_", 
            "Transferred_tel__631100105_", 
            "FarEndDisconnect", 
            "FarEndDisconnect_Hangup", "DutchAOS", 
            "SwedenAOS", 
            "Transferred_tel__63000_")), class = 
c("tbl_df", "tbl", "data.frame" 
), row.names = c(NA, -16L), .Names = "name") 

# Network 
my_links = structure(list(key = c("0_1", "0_6", "1_13", "1_14", "1_2", "11_12", 
            "13_11", "13_3", "14_11", "14_3", "2_11", 
            "2_3", "3_10", "3_15", 
            "3_4", "3_5", "3_7", "3_8", "3_9", "6_13", 
            "6_2"), source = c(0L, 
            0L, 1L, 1L, 1L, 11L, 13L, 13L, 14L, 14L, 2L, 
            2L, 3L, 3L, 3L, 
            3L, 3L, 3L, 3L, 6L, 6L), target = c(1L, 6L, 
            13L, 14L, 2L, 12L, 
            11L, 3L, 11L, 3L, 11L, 3L, 10L, 15L, 4L, 5L, 
            7L, 8L, 9L, 13L, 
            2L), total = c(38L, 36L, 4L, 3L, 31L, 6L, 2L, 
            5L, 1L, 2L, 3L, 
            61L, 11L, 1L, 12L, 11L, 11L, 11L, 11L, 3L, 
            33L)), class = c("tbl_df", 
          "tbl", "data.frame"), row.names = c(NA, -21L), .Names 
= c("key", 
    "source", "target", "total")) 


# NOT WORKING using "NodeID", or "NodeGroup" 
sankey1 = sankeyNetwork(Links =my_links, Nodes = my_nodes, Source = 
          "source", Target = "target", Value = "total", units = 
          "calls", NodeID = "name") 

sankey2 = sankeyNetwork(Links =my_links, Nodes = my_nodes, Source = 
          "source", Target = "target", Value = "total", units = 
          "calls", NodeGroup = "name") 
sankey2 

# NOT WORKING using ColourScale (diagram is displayed, grey scale though) 
ColourScale <- 'd3.scale.ordinal() 
      .domain(["lions", "tigers"]) 
      .range(["#FF6900", "#694489"]);' 
sankey3 = sankeyNetwork(Links =my_links, Nodes = my_nodes, Source = 
          "source", Target = "target", Value = "total", units = 
          "calls", colourScale = JS(ColourScale)) 
sankey3 

# WORKING! 

sankey4 = sankeyNetwork(Links =my_links, Nodes = my_nodes, Source = 
          "source", Target = "target", Value = "total", units = 
          "calls") 
sankey4 

«Sankey1» пытается с помощью «NoteID», как он используется в примере из Интернета, указанным выше, однако, делать это приводит диаграмма не отображается вообще; тот же эффект для «Sankey2». «Sankey4» отображается серым цветом независимо от определения цветовой схемы.

Я также просмотрел код html, созданный обоими, мой код R, производящий «Sankey1», а также код, используемый на https://christophergandrud.github.io/networkD3/#sankey. Очевидно, что существует разница в отношении группы:

HTML от "Sankey1":

"group":{"name":["HawaiTEST", ... 
... 
"options":{"NodeID":1,"NodeGroup":"name","LinkGroup":null, 

HTML отрывок из веб-примера:

"group":["Agricultural 'waste'","Bio-conversion", ... 
... 
"options":{"NodeID":"name","NodeGroup":"name","LinkGroup":null 

Изменение выходного HTML для "Sankey1" в чтобы отразить вывод из веб-примера, решает проблему, «Sankey1» отображается с использованием схемы цветов по умолчанию.

Я нахожусь в стене в данный момент, пытаясь понять поведение данных, которые я использую. Функция sankey не полагается на ввод обязательного списка; Я на самом деле alos разбил пример набора данных с веб-сайта на два кадра данных (узлы, ссылки), это создает одну и ту же диаграмму sankey с цветами, как в веб-примере. Следовательно, что-то должно быть неправильно с входными данными в моем примере ... Полагаю ... Любая помощь была бы высоко оценена! Благодаря Oli

ответ

0

У меня была аналогичная проблема. Я разрешил его, уменьшив общее количество узлов (путем фильтрации только ребер над определенным значением).

4

Может быть, я недоразумение, но используя либо версию CRAN или GitHub, sankey1 производит следующие действия для меня с узлами цветные, как ожидается, по их имени.

sankey diagram 1 with colors

Если мы хотим использовать NodeGroup, мы могли бы сделать что-то вроде этого.

# make up a group based on the first two characters 
# of node name 
my_nodes$group <- substr(my_nodes$name,1,2) 
# now use our new group for group colors 
sankeyNetwork(
    Links =my_links, Nodes = my_nodes, Source = "source", 
    Target = "target", Value = "total", NodeID = "name", 
    units = "calls", 
    NodeGroup = "group" 
) 

sankey with grouped colors

Если мы хотим поставить специальную цветовую гамму, мы могли бы это сделать.

sankeyNetwork(
    Links =my_links, Nodes = my_nodes, Source = "source", 
    Target = "target", Value = "total", NodeID = "name", 
    units = "calls", 
    NodeGroup = "group", 
    colourScale = "d3.scale.category10()" 
) 

sankey with custom color scale

Для пользовательского присвоения цветов, мы могли бы расширить предыдущий пример и рубить из d3.scale.category* функций.

sankeyNetwork(
    Links =my_links, Nodes = my_nodes, Source = "source", 
    Target = "target", Value = "total", NodeID = "name", 
    units = "calls", 
    NodeGroup = "group", 
    colourScale = sprintf(
    "d3.scale.category10().range(%s).domain(%s)", 
    jsonlite::toJSON(substr(topo.colors(length(unique(my_nodes$group))),1,7)), 
    jsonlite::toJSON(unique(my_nodes$group)) 
) 
) 

sankey with custom group colors

+0

Спасибо! Проблема на моем конце, очевидно, была связана с настройкой кэширования моего интернет-соединения. После создания диаграммы sankey, которую я назвал «Sankey4» в публикации, браузер не захватил ни одну из модифицированных версий («Sankey1/2/3»), bugger. Да, сейчас все работает. Благодаря вашему отчету о успехе я попробовал его на другом компьютере - что-то, что я должен был сделать раньше, в первую очередь. Еще раз большое спасибо за то, что посмотрели на эту проблему. – Oliver

+0

Я нашел что-то интересное. Очевидно, что моя проблема была вызвана не только настройкой кэширования. – Oliver

+0

Я нашел что-то интересное. Очевидно, что моя проблема была вызвана не только настройкой кэширования. Все работает так, как описано в вашем ответе. Однако, как только я загружу библиотеки «dplyr» и/или «tidyr» перед вызовом функции networkD3 для создания сети, диаграмма «sankey1» создает неверный HTML-код, как указано выше («« group »: {« name ": [" HawaiTEST ", ..."), что в итоге приводит к пустой диаграмме. – Oliver