使用ggplot或R中的任何其他方法基于计数绘制线宽(大小)
我有一个长格式的数据集,每个ID“走”3个步骤,每个步骤(变量名为步骤)可以在不同的位置着陆(变量名为里程碑),我想绘制所有路径。因为有一些路径的行程更多,所以我想使路径的宽度(大小)与其计数成比例。我把它想象成ggplot中的使用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
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)