在R中为平均值,平均值+ sd和平均值sd添加到多因子散点图

时间:2016-02-27 00:09:14

标签: r ggplot2

我有

形式的数据
cvar1  cvar1  numvar
a      x      0.1
a      y      0.2
b      x      0.15
b      y      0.25

即两个分类变量和一个数值变量。

使用ggplot2,我可以通过执行qplot(y = numvar,x = interaction(cvar1,cvar2))得到一个很好的散点图,用于绘制cv1cv2的每个组合的数据。这给了我几列这样的点:

enter image description here

对于这些列中的每一列,我想添加一条小水平线,表示该列中数据点的平均值。和一个类似的小水平线的平均值+ sd和均值 - sd。 (有点是一个标准化的盒子图,但所有点都可见,使用均值和sd而不是中位数和IQR。)提前致谢!

1 个答案:

答案 0 :(得分:3)

您可以创建一个表格,其中包含每组点数的平均值和平均值+/- sd。然后,您可以使用geom_segment()绘制线条。

首先,我创建一些示例数据:

set.seed(1245)
data <- data.frame(cvar1 = rep(letters[1:2], each = 12),
                   cvar2 = rep(letters[25:26], times = 12),
                   numvar = runif(2*12))

这会使用dplyrtidyr创建包含您需要的值的表格:

library(dplyr)
library(tidyr)
summ <- group_by(data, cvar1, cvar2) %>%
        summarise(mean = mean(numvar),
                  low = mean - sd(numvar),
                  high = mean + sd(numvar)) %>%
        gather(variable, value, mean:high)

这三行执行以下操作:首先,将数据拆分为组,然后为每个组计算三个必需值。最后,数据将转换为长格式,这是ggplot()所需的。 (也许你对[{1}}更熟悉,它与melt()基本相同)

最后,这创造了情节:

gather()

enter image description here

你可能不会想要这些颜色。我刚刚添加它们以使示例更清晰。

gplot(data) + geom_point(aes(x = interaction(cvar1, cvar2), y = numvar)) + geom_segment(data = summ, aes(x = as.numeric(interaction(cvar1, cvar2)) - .5, xend = as.numeric(interaction(cvar1, cvar2)) + .5, y = value, yend = value, colour = variable)) 需要指定每一行的起点和终点坐标。因为geom_segments()是一个因素,所以需要先将其转换为数字,然后才能对其进行算术运算。我添加并减去0.5到interaction(cvar1, cvar2),这使得线条相当宽。选择较小的值会缩短线条。