NetworkD3 パッケージを使用して、2 層の Sankey Networks をプロットすることに成功しました。ソース、ターゲット、値の列のデータフレームを取り、サンキー プロットを出力する関数を作成しました。この関数を使用して、同様のプロットをすばやく作成できます。私の質問は関数の効率に関するものではありませんが、おそらく私の問題の原因は関数にあります。
以下に、再現可能な例を示します。関数が 2 つのデータセット (z1 と z2) の SankeyNetwork を生成する方法を示します。ただし、これらのデータセットを 3 層の SankeyNetwork を作成するというアイデアと組み合わせると、ビューアーには何もプロットされません (幅と高さも増やそうとしました)。これはインデックス作成と関係があるのではないかと推測していますが、以前はインデックスをゼロにする必要があるというエラー出力が表示されていました。エラーは表示されず、空白のプロットが表示されます。
library(networkD3)
library(dplyr)
# The function used to create the plots
sanktify <- function(x) {
# Create nodes DF with the unique sources & targets from input
nodes <- unique(data.frame(c(unique(x$source), unique(x$target))))
nodes$ID <- as.numeric(rownames(nodes)) - 1 # sankeyNetwork requires IDs to be zero-indexed
names(nodes) <- c("name", "ID")
# Create two versions of nodes for merging
nodes_source <- nodes
nodes_target <- nodes
names(nodes_source) <- c("source", "source_ID")
names(nodes_target) <- c("target", "target_ID")
# Replace source & target in links DF with IDs
links <- merge(x, nodes_source, by="source", all.x=TRUE) %>%
merge(nodes_target, by="target", all.x=TRUE) %>%
select(source_ID, target_ID, value) %>%
arrange(source_ID)
# Create Sankey Plot
sank <- sankeyNetwork(
Links = links,
Nodes = nodes,
Source = "source_ID",
Target = "target_ID",
Value = "value",
NodeID = "name",
units = "USD",
fontSize = 12,
nodeWidth = 30
)
return(sank)
}
# Creating & plotting first data frame.
z1 <- tbl_df(data.frame(source = c("A", "A", "B", "B"),
target = c("Cardiovascular", "Neurological", "Cardiovascular", "Neurological"),
value = c(5, 8, 2, 10)))
z1$source <- as.character(z1$source)
z1$target <- as.character(z1$target)
sanktify(z1) # Correctly produces plot
# Creating & plotting 2nd data frame
z2 <- tbl_df(data.frame( source = c("Cardiovascular", "Cardiovascular", "Neurological", "Neurological"),
target = c("IP Surg", "IP Med", "IP Surg", "IP Med"),
value = c(3, 7, 6, 1)))
z2$source <- as.character(z2$source)
z2$target <- as.character(z2$target)
sanktify(z2) # Correctly produces plot
# Combining the two dataframes into a new DF with the goal of creating a '3-layer' plot.
z3 <- rbind(z1, z2)
sanktify(z3) # Blank output. No errors in the R console