【问题标题】:Sankey Diagram with R library networkD3 does not show colors带有 R 库 networkD3 的桑基图不显示颜色
【发布时间】:2016-08-02 15:19:33
【问题描述】:

我正在使用 R 的 networkD3 库来创建 Sankey 网络。虽然这对我来说效果很好,但我现在遇到了一个问题,即分配属性“NoteID”和/或“NoteGroup”来分组和分配颜色,如https://christophergandrud.github.io/networkD3/#sankey

以下代码显示了 4 个创建 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 上使用的代码。显然,关于组是有区别的:

来自“Sankey1”的HTML:

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

网页示例的 HTML 摘录:

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

更改“Sankey1”的输出 html 以反映 Web 示例的输出解决了该问题,“Sankey1”使用默认颜色模式显示。

我目前正试图了解我正在使用的数据的行为。 sankey 函数不依赖于强制列表输入;实际上,我已经将网站中的示例数据集拆分为两个数据框(节点、链接),这确实产生了与 web 示例中相同的带有颜色的 sankey 图。因此,我的示例中的输入数据一定有问题......我猜......任何帮助将不胜感激! 谢谢 奥利

【问题讨论】:

    标签: r sankey-diagram htmlwidgets networkd3


    【解决方案1】:

    也许,我误解了,但使用 CRAN 或 Github 版本,sankey1 会为我生成以下内容,其中节点按其名称预期着色。

    如果我们想使用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"
    )
    

    如果我们想提供自定义色标,我们可以这样做。

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

    对于颜色的自定义分配,我们可以扩展前面的示例并删除 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))
      )
    )
    

    【讨论】:

    • 谢谢!我的问题显然是由于我的互联网连接的缓存设置。在生成我在帖子中称为“Sankey4”的 sankey 图后,浏览器没有抓取任何修改版本(“Sankey1/2/3”),bugger。是的,现在一切正常。多亏了您的成功报告,我已经在另一台计算机上进行了尝试——这是我之前应该做的事情。再次感谢您查看此问题。
    • 我发现了一些有趣的东西。显然,我的问题毕竟不仅仅是缓存设置引起的。
    • 我发现了一些有趣的东西。显然,我的问题毕竟不仅仅是由缓存设置引起的。一切都按照您的答案中的描述进行。但是,只要我在调用 networkD3 函数创建网络之前加载库“dplyr”和/或“tidyr”,图表“sankey1”就会生成错误的 HTML 代码,如上所示(“”组“:{”名称":["HawaiTEST", ..."),最终生成一个空图表。
    • 您是使用相同的代码,还是改用dplyrtidyr
    【解决方案2】:

    我遇到了类似的问题。我通过减少节点的总数来解决它(通过仅过滤高于某个值的边)。

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2017-10-23
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      相关资源
      最近更新 更多