我正在嘗試創建一個 sankey 圖,但連接結果都搞砸了。這是我的資料:
#> A tibble: 61 x 3
#> # Groups: id_2 [55]
#> id_2 origin target
#> <int> <fct> <chr>
#> 1 4 Pendlerkort i app Rejsekort
#> 2 38 Ungdomskort Rejsekort
#> 3 84 Rejsekort Rejsekort
#> 4 89 Rejsekort Pendlerkort i app
#> 5 95 Rejsekort Rejsekort
#> 6 112 Rejsekort Pendlerkort Rejsekort
#> 7 118 Pendler20 Rejsekort med pendler kombi
#> 8 140 Pendlerkort i app Rejsekort
#> 9 167 DSB Orange Pendler20
#> 10 193 Rejsekort Rejsekort
#> # ... with 51 more rows
sankey_plot <-
tibble::tribble(
~id_2, ~origin, ~target,
4L, "Pendlerkort i app", "Rejsekort",
38L, "Ungdomskort", "Rejsekort",
84L, "Rejsekort", "Rejsekort",
89L, "Rejsekort", "Pendlerkort i app",
95L, "Rejsekort", "Rejsekort",
112L, "Rejsekort Pendlerkort", "Rejsekort"
)
然后我運行以下代碼:
# create nodes
nodes <- data.frame(
name=c(as.character(sankey_plot$origin),
as.character(sankey_plot$target)) %>% unique()
)
# Get values
sankey_plot <- sankey_plot %>% group_by(origin, target) %>%
summarise(values = n())
sankey_plot <- sankey_plot %>%
dplyr::ungroup()
# Create source and target ID's
sankey_plot$IDsource <- match(sankey_plot$origin, nodes$name)-1
sankey_plot$IDtarget <- match(sankey_plot$target, nodes$name)-1
# Plot
sankeyNetwork(Links = sankey_plot, Nodes = nodes,
Source = "IDsource", Target = "IDtarget",
Value = "values",
NodeID = "name",
# fontSize = 10
nodeWidth = 20,
sinksRight = TRUE)
這給了我一個看起來像這樣的混亂情節:

我不知道我做錯了什么。我嘗試以幾種不同的方式創建節點。同樣在我不這樣做的地方group_by(),只是讓每一行代表每個動作(而不是計數)。情節最終看起來一樣
uj5u.com熱心網友回復:
鑒于您提供的示例資料,回圈是預期的。例如,第 3 行表示在同一節點開始和結束的鏈接,第 1 行表示來自節點(“Pendlerkort I app”)的鏈接,該鏈接跟隨“Rejsekort”節點,然后鏈接回“Rejsekort”節點再次。
sankey_plot
#> # A tibble: 5 × 5
#> origin target values IDsource IDtarget
#> <fct> <chr> <int> <dbl> <dbl>
#> 1 Pendlerkort i app Rejsekort 1 0 2
#> 2 Rejsekort Pendlerkort i app 1 2 0
#> 3 Rejsekort Rejsekort 2 2 2
#> 4 Rejsekort Pendlerkort Rejsekort 1 3 2
#> 5 Ungdomskort Rejsekort 1 1 2

如果您期望的是不同的節點都具有相同的名稱“Rejsekort”,那么您將必須區分資料中的這些節點。
library(dplyr)
library(networkD3)
sankey_plot <-
tibble::tribble(
~id_2, ~origin, ~target,
4L, "Pendlerkort i app", "Rejsekort",
38L, "Ungdomskort", "Rejsekort",
84L, "Rejsekort", "Rejsekort",
89L, "Rejsekort", "Pendlerkort i app",
95L, "Rejsekort", "Rejsekort",
112L, "Rejsekort Pendlerkort", "Rejsekort"
)
dupe_targets <- sankey_plot$target == "Rejsekort"
sankey_plot$target[dupe_targets] <-
paste0(sankey_plot$target[dupe_targets], "_", seq_along(sankey_plot$target[dupe_targets]))
sankey_plot$values <- 1
# create nodes
nodes <- data.frame(
name=c(as.character(sankey_plot$origin),
as.character(sankey_plot$target)) %>% unique()
)
# Create source and target ID's
sankey_plot$IDsource <- match(sankey_plot$origin, nodes$name)-1
sankey_plot$IDtarget <- match(sankey_plot$target, nodes$name)-1
sankey_plot
#> # A tibble: 6 × 6
#> id_2 origin target values IDsource IDtarget
#> <int> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 4 Pendlerkort i app Rejsekort_1 1 0 4
#> 2 38 Ungdomskort Rejsekort_2 1 1 5
#> 3 84 Rejsekort Rejsekort_3 1 2 6
#> 4 89 Rejsekort Pendlerkort i app 1 2 0
#> 5 95 Rejsekort Rejsekort_4 1 2 7
#> 6 112 Rejsekort Pendlerkort Rejsekort_5 1 3 8
sankeyNetwork(Links = sankey_plot, Nodes = nodes,
Source = "IDsource", Target = "IDtarget",
Value = "values",
NodeID = "name",
# fontSize = 10
nodeWidth = 20,
sinksRight = TRUE)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/494556.html
標籤:r d3.js 桑基图 htmlwidgets 网络d3
上一篇:為d3折線圖反應加載資料
下一篇:拖放后重新渲染
