微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 R 网络包的桑基图

如何解决带有 R 网络包的桑基图

我正在尝试按照 R Graph gallery 的说明创建一个简单的 Sankey 图:https://www.r-graph-gallery.com/322-custom-colours-in-sankey-diagram.html我有一个数据集,每个 ID 有两个 obv。对于每个时期,我都知道某人是否贫穷。数据集如下所示:

ID   YEAR   POVERTY
1    2018      0
1    2019      1
2    2018      1
2    2019      1
3    2018      0
3    2019      1
4    2018      0
4    2019      0
5    2018      0
5    2018      0

我想我需要将其转换为源-目标-值表,但我不明白“值”是什么意思。有人给我解释一下吗?我怎样才能继续前进?

非常感谢您的帮助:)

我使用了它提供的代码

library("dplyr",warn.conflicts = FALSE)
library("networkD3")

diagram <- SUBSET05%>% 
  dplyr::mutate(Poverty = dplyr::if_else(Poverty==1,"poor","not poor")) %>% 
  dplyr::transmute(id_nmbr,yr_interview,Poverty = paste(Poverty,sep = "_"))

links <- diagram %>%
  tidyr::pivot_wider(names_from = yr_interview,values_from = Poverty) %>% 
  dplyr::rename(source = `2018`,target = `2019`)

nodes <- data.frame(name = unique(c(links$source,links$target))) %>% 
  tidyr::separate(name,into = c("group","year"),sep = "_",remove = FALSE)

links$id_nmbrsource <- match(links$source,nodes$name)-1 
links$id_nmbrtarget <- match(links$target,nodes$name)-1
links$value <- 10

sn <- sankeyNetwork(Links = links,Nodes = nodes,NodeID = "name",Source = "id_nmbrsource",Target = "id_nmbrtarget",NodeGroup = "group",Value = "value")
sn 

我得到以下图像:

enter image description here

我的数据集有 34034 个观测值,每年 17017 个。我是否必须因此更改值列?什么可能导致丑陋的图像?

解决方法

我不确定我是否真的了解您希望您的输出是什么样子。

无论如何,我认为“价值”在您的情况下并不重要。每个连接具有相同的重要性,因此您可以将其设置为任意值。

如果只是为了显示有多少人从贫困转向非贫困,那么出发点应该是在两个时间段内实际上有四个组:“贫困”和“非贫困”。

结果应该是这样的:

library("dplyr",warn.conflicts = FALSE)
library("networkD3")


df <- tibble::tribble(
  ~ID,~YEAR,~POVERTY,"1",2018,2019,1,"2","3","4","5",0
) %>% 
  dplyr::mutate(POVERTY = dplyr::if_else(POVERTY==0,"poor","not poor")) %>% 
  dplyr::transmute(ID,YEAR,POVERTY = paste(POVERTY,sep = "_")) 


links <- df %>% 
  tidyr::pivot_wider(names_from = YEAR,values_from = POVERTY) %>% 
  dplyr::rename(source = `2018`,target = `2019`) 

nodes <- data.frame(name = unique(c(links$source,links$target))) %>% 
  tidyr::separate(name,into = c("group","year"),sep = "_",remove = FALSE)


links$IDsource <- match(links$source,nodes$name)-1 
links$IDtarget <- match(links$target,nodes$name)-1
links$value <- 10


sn <- sankeyNetwork(Links = links,Nodes = nodes,NodeID = "name",Source = "IDsource",Target = "IDtarget",NodeGroup = "group",Value = "value") 

sn

sankey

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。