我有
形式的数据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))得到一个很好的散点图,用于绘制cv1
和cv2
的每个组合的数据。这给了我几列这样的点:
对于这些列中的每一列,我想添加一条小水平线,表示该列中数据点的平均值。和一个类似的小水平线的平均值+ sd和均值 - sd。 (有点是一个标准化的盒子图,但所有点都可见,使用均值和sd而不是中位数和IQR。)提前致谢!
答案 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))
这会使用dplyr
和tidyr
创建包含您需要的值的表格:
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()
你可能不会想要这些颜色。我刚刚添加它们以使示例更清晰。
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)
,这使得线条相当宽。选择较小的值会缩短线条。