【发布时间】:2021-07-20 02:59:19
【问题描述】:
我一直在跟踪堆栈上的示例,以使用 NetworkD3 包创建桑基图。我想设置特定于列变量event 的链接的颜色。我拥有的数据有多个列:
structure(list(names = c("bell", "john", "andrew", "sam", "bell",
"bell", "andrew"), event = c("Event 1", "Event 2", "Event 3",
"Event 1", "Event 2", "Event 4", "Event 1"), response = c("Yes",
"Yes", "No", "Yes", "No", "Yes", "No")), class = "data.frame", row.names = c(NA,
-7L))
> d
names event response
1 bell Event 1 Yes
2 john Event 2 Yes
3 andrew Event 3 No
4 sam Event 1 Yes
5 bell Event 2 No
6 bell Event 4 Yes
7 andrew Event 1 No
按照 CJ Yetman 的示例(非常感谢您阅读本文后提供的非常可遵循的示例!)here,创建了链接和节点的数据框:
links <- d %>%
mutate(row = row_number()) %>%
gather('column', 'source', -row) %>%
mutate(column = match(column, names(d))) %>%
group_by(row) %>%
arrange(column) %>%
mutate(target = lead(source)) %>%
ungroup %>%
filter(!is.na(target)) %>%
#index
mutate(source = paste0(source, '_', column)) %>%
mutate(target = paste0(target, '_', column + 1)) %>%
select(source, target)
nodes <- data.frame(
name=c(as.character(links$source), as.character(links$target)) %>%
unique()
)
然后我将nodes 数据框中的索引与links 数据框中的source 和target 列进行匹配。在这种情况下,我改变了新列而不是覆盖它,因为它更容易阅读:
link <- links %>%
mutate(IDsource = match(links$source, nodes$name)-1) %>%
mutate(IDtarget = match(links$target, nodes$name)-1) %>%
mutate(value = 1) %>%
#remove index
mutate(source = sub('_[0-9]+$', '', source)) %>%
mutate(target = sub('_[0-9]+$', '', target))
#
nodes$name <- sub('_[0-9]+$', '', nodes$name)
如前所述,我想通过event 设置整个桑基图流中的链接颜色。 Here 指定在links 和nodes 中创建一个新列,以匹配d3.scaleOrdinal() 函数中指定的色标。
#New column to set colour for nodes
nodes$node.col <- as.factor(c("nod.col")) #set nodes to one colour only
#New column for links
col.index <- d %>%
select(event) %>% unique(); col.index #get events from original dataframe
#mutate new column to set colours for links
links$links.col <- col.index$event[match(links$source, col.index$event)]
links$links.col[is.na(links$links.col)] <- col.index$event[match(links$target[is.na(links$links.col)], col.index$event)]
links$links.col <- as.factor(links$links.col) #change to factors
#d3.scaleOrdinal()
my_color <- 'd3.scaleOrdinal() .domain(["Event 1", "Event 2", "Event 3", "Event 4", "nod.col"]) .range(["red", "blue", "red", "yellow", "gray"])'
但是,当每个事件都应该有自己的颜色(在整个流程中)时,链接都是红色的。
sankeyNetwork(Links = links, Nodes = nodes, Source = 'IDsource',
Target = 'IDtarget', Value = 'value', NodeID = 'name', colourScale=my_color,
LinkGroup="links.col", NodeGroup="node.col")
谁能解释我做错了什么?我遇到的另一个问题是手动设置d3.scaleOrdinal() 中每个事件的颜色。如果有一种有效的方法可以做到这一点,我需要为多达 30 个或更多事件设置颜色?
【问题讨论】:
标签: r sankey-diagram