使用ggplot或R中的任何其他方法基于计数绘制线宽(大小)

使用ggplot或R中的任何其他方法基于计数绘制线宽(大小),r,ggplot2,sankey-diagram,R,Ggplot2,Sankey Diagram,我有一个长格式的数据集,每个ID“走”3个步骤,每个步骤(变量名为步骤)可以在不同的位置着陆(变量名为里程碑),我想绘制所有路径。因为有一些路径的行程更多,所以我想使路径的宽度(大小)与其计数成比例。我把它想象成ggplot中的geom_线(aes(size=…count..),但它不起作用 下面是我的代码,在代码中可以找到示例数据集的url。我愚蠢的增加宽度的解决方案是避开线条,但它不成比例,而且会留下裂缝 ddnew <- read.csv("https://raw.github.co

我有一个长格式的数据集,每个ID“走”3个步骤,每个步骤(变量名为步骤)可以在不同的位置着陆(变量名为里程碑),我想绘制所有路径。因为有一些路径的行程更多,所以我想使路径的宽度(大小)与其计数成比例。我把它想象成ggplot中的
geom_线(aes(size=…count..)
,但它不起作用

下面是我的代码,在代码中可以找到示例数据集的url。我愚蠢的增加宽度的解决方案是避开线条,但它不成比例,而且会留下裂缝

ddnew <- read.csv("https://raw.github.com/bossaround/question/master/data9.csv" ) 
ggplot(ddnew, aes(x=step, y=milestone, group=user_id)) +
  geom_line(position = position_dodge(width=0.05)) +
  scale_x_discrete(limits=c("0","1","2","3","4","5","6","7","8","9")) +
  scale_y_discrete(limits=c("0","1","2","3","4","5","6","7","8","9"))
ddnew这有帮助吗

library(ggplot2)
ddnew <- read.csv("https://raw.github.com/bossaround/question/master/data9.csv" ) 
ggplot(ddnew, aes(x=step, y=milestone, group=user_id)) +
        stat_summary(geom="line", fun.y = "sum", aes(size=milestone),alpha=0.2, color="grey50")+
        scale_x_discrete(limits=factor(0:2)) +
        scale_y_discrete(limits=factor(0:10)) +
        theme(panel.background = element_blank(), 
              legend.position = "none")
库(ggplot2)
ddnew如果您正在查找用户指定的路径计数,那么这可能会有所帮助:

ddnew <-   read.csv("https://raw.github.com/bossaround/question/master/data9.csv" ) 

ddnew <- ddnew %>% 
  group_by(user_id) %>% 
  mutate(step_id = paste(step, collapse = ","), 
         milestone_id = paste(milestone, collapse = ",")) %>% 
  group_by(step_id, milestone_id) %>% 
  mutate(width = n())

ggplot(ddnew, aes(x=step, y=milestone, group=user_id)) +
  geom_line(aes(size = width)) +
  scale_x_discrete(limits=c("0","1","2","3","4","5","6","7","8","9")) +
  scale_y_discrete(limits=c("0","1","2","3","4","5","6","7","8","9"))
ddnew%
mutate(step_id=paste(step,collapse=“,”),
里程碑\u id=粘贴(里程碑,折叠=“,”)%%>%
分组依据(步骤id、里程碑id)%>%
变异(宽度=n()
ggplot(ddnew,aes(x=步骤,y=里程碑,组=用户id))+
几何线(aes(尺寸=宽度))+
刻度x离散(限值=c(“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”))+
刻度y离散(限值=c(“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”))
其思想是计算特定于用户的唯一路径,并将这些计数指定为
geom_line()
中的宽度。

一个选项是使用
riverplot
软件包。首先,需要汇总数据,以便定义边和节点

> library(riverplot)
> 
> paths <- spread(ddnew, step, milestone) %>%
+   count(`1`, `2`, `3`)
> paths
Source: local data frame [9 x 4]
Groups: 1, 2 [?]

    `1`   `2`   `3`     n
  <int> <int> <int> <int>
1     1     2     3     7
2     1     2    10     8
3     1     3     2     1
4     1     4     8     1
5     1    10     2   118
6     1    10     3    33
7     1    10     4     2
8     1    10     5     1
9     1    10    NA    46
>库(riverplot)
> 
>路径%
+计数(`1`、`2`、`3`)
>路径
来源:本地数据帧[9 x 4]
组:1,2[?]
`1``2``3`n
1     1     2     3     7
2     1     2    10     8
3     1     3     2     1
4     1     4     8     1
5     1    10     2   118
6     1    10     3    33
7     1    10     4     2
8     1    10     5     1
9 1 10 NA 46
接下来定义节点(即步骤和里程碑的每个组合)

前缀%
选择(ID,x=步长,y)
然后定义边:

e12 <- group_by(paths, N1 = `1`, N2 = `2`) %>%
  summarise(Value = sum(n)) %>%
  ungroup() %>%
  mutate(N1 = prefix(1, N1),
         N2 = prefix(2, N2))

e23 <- group_by(paths, N1 = `2`, N2 = `3`) %>%
  filter(!is.na(N2)) %>%
  summarise(Value = sum(n)) %>%
  ungroup() %>%
  mutate(N1 = prefix(2, N1),
         N2 = prefix(3, N2))

edges <- bind_rows(e12, e23) %>% 
  mutate(Value = Value) %>%
  as.data.frame()
e12%
总结(值=总和(n))%>%
解组()%>%
变异(N1=前缀(1,N1),
N2=前缀(2,N2))
e23%
过滤器(!is.na(N2))%>%
总结(值=总和(n))%>%
解组()%>%
变异(N1=前缀(2,N1),
N2=前缀(3,N2))
边缘%
变异(值=值)%>%
as.data.frame()
最后,做一个情节:

style <- default.style()
style$srt <- '0'  # display node labels horizontally

makeRiver(nodes, edges) %>% plot(default_style = style)

款式谢谢knb!我从没想过统计摘要。但是,您的代码没有给出正确的解决方案,我认为
fun.y=“sum”
给出了值的总和,但没有给出案例的计数。如果有类似于
fun.y=“count”
的问题,它会解决。乔尔,谢谢你的回答,我在计数时遇到了一个错误(
1
2
3
。错误消息显示找不到对象“1”。。。知道哪里出了问题吗?谢谢,我不确定。
spread(ddnew,step,milestone)
给出了三个新的列,分别称为
1
2
3
?我想出来了,让R识别数字作为变量名是很困难的。。。我更改了变量名,结果很好。再次感谢!Joel,现在我已经将1、2和3重命名为step1、step2和step3,我应该在Define Edge部分编写
e12%
?我不知道“`”是做什么的,没错。后引号用于不符合R命名约定的列名。
style <- default.style()
style$srt <- '0'  # display node labels horizontally

makeRiver(nodes, edges) %>% plot(default_style = style)