Hello R和gglplot pros,
我正在尝试使用R和ggplot2创建图形,其中包含点图,箱形图和线图。我附上一个例子,最终结果如何:
我创建了一个数据框(数据),其中包含四个时间点(长格式)的数据和一个额外的ID变量:
ID time value
1 T1 11
1 T1 22
1 T2 11
2 T1 22
2 T2 22
2 T2 44
...
我可以创建箱形图和点图,并使用单独的颜色区分组。我的ggplot2脚本目前看起来像那样:
ggplot(data=data, aes(x=factor(time), y=value, fill=ID)) +
geom_boxplot(fill="white") +
geom_dotplot(binaxis="y", stackdir="center")
如何将T1中的点与T2,T3 T4中的相应点连接?
提前感谢任何建议!
一切顺利, 克里斯
答案 0 :(得分:1)
让我根据我对问题的理解创建一些示例数据:
n <- 7
dfA <- data.frame(group='A',tie=LETTERS[1:n], val=rnorm(n)*27.1)
dfB <- dfA
dfB$group <- 'B'
dfB$val <- dfA$val + rnorm(n)*3.14
这会创建两个数据集dfA和dfB。假设dfA和dfB通过[tie]链接。
> head(dfA)
group tie val
1 A A -9.835
2 A B 35.575
3 A C 13.117
4 A D 18.802
5 A E -29.504
6 A F -56.461
> head(dfB)
group tie val
1 B A -12.62
2 B B 32.43
3 B C 7.83
4 B D 17.27
5 B E -28.56
6 B F -59.93
现在的诀窍是创建两个版本的数据,一个是长数据,一个是宽的(实际上,如果你从长数据开始,如此处所示,或者使用宽数据,这无关紧要 - 你只需要在端)
dflong <- rbind(dfA, dfB)
dfwide <- merge(dfA, dfB, by='tie')
这给了我们:
> head(dflong, 10)
group tie val
1 A A -9.835
2 A B 35.575
3 A C 13.117
4 A D 18.802
5 A E -29.504
6 A F -56.461
7 A G 44.464
8 B A -12.625
9 B B 32.430
10 B C 7.830
> head(dfwide)
tie group.x val.x group.y val.y
1 A A -9.835 B -12.62
2 B A 35.575 B 32.43
3 C A 13.117 B 7.83
4 D A 18.802 B 17.27
5 E A -29.504 B -28.56
6 F A -56.461 B -59.93
现在ggplot将相同数据的两个不同版本放在一起:
ggplot(data=dflong, aes(x=group, y=val, color=group)) +
theme_bw() +
geom_boxplot() +
geom_segment(data=dfwide, aes(x=group.x, xend=group.y, y=val.x, yend=val.y, color='A'), color='grey') +
geom_text(aes(label=tie))
这就产生了理想的情节
注意:geom_segment()的aes()中的color ='A'是一个强制性的hack,可以将广泛的第二个数据集潜入长集合设置的机制中。它在aes()之外用color = gray设置重新设置。
如果dfA和dfB之间没有1:1的关系,则需要处理seperatley。