使用ggplot2创建点图+箱形图+线图

时间:2016-03-17 16:06:09

标签: r ggplot2

Hello R和gglplot pros,

我正在尝试使用R和ggplot2创建图形,其中包含点图,箱形图和线图。我附上一个例子,最终结果如何:

enter image description here

我创建了一个数据框(数据),其中包含四个时间点(长格式)的数据和一个额外的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中的相应点连接?

提前感谢任何建议!

一切顺利, 克里斯

1 个答案:

答案 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)) 

这就产生了理想的情节

enter image description here

注意:geom_segment()的aes()中的color ='A'是一个强制性的hack,可以将广泛的第二个数据集潜入长集合设置的机制中。它在aes()之外用color = gray设置重新设置。

如果dfA和dfB之间没有1:1的关系,则需要处理seperatley。