2016-08-02 22 views
1

我正在使用R的networkD3庫來創建Sankey網絡。雖然這對我來說很好,但現在我遇到了分配屬性「NoteID」和/或「NoteGroup」以分組和分配顏色的問題,如https://christophergandrud.github.io/networkD3/#sankeySankey圖與R庫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代碼,生成「Sankey1」的R代碼以及在https://christophergandrud.github.io/networkD3/#sankey上使用的代碼。很顯然,沒有關於該組的區別:

HTML從 「Sankey1」:

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

在改變輸出HTML的 「Sankey1」:從網絡例如

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

HTML摘錄爲了反映Web示例的輸出解決了問題,使用默認顏色模式顯示「Sankey1」。

我打了一堵牆,試圖瞭解我正在使用的數據的行爲。 sankey功能不依賴強制性列表輸入;我實際上已經將來自網站的示例數據集分成了兩個數據框(節點,鏈接),這確實產生了與web示例中顏色相同的sankey圖。因此,我的例子中的輸入數據肯定是錯誤的......我想......任何幫助將不勝感激! 感謝 奧利

回答

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

我發現了一些有趣的東西。顯然,我的問題不僅僅是由緩存設置引起的。 一切工作正如你的答案中所述。但是,只要在調用networkD3函數創建網絡之前加載庫「dplyr」和/或「tidyr」,圖「sankey1」就會產生錯誤的HTML代碼,如上所示(「」group「:{」name 「:[」HawaiTEST「,...」),最終得到一個空的圖。 – Oliver