我的数据框mydataAll
包含DESWC
,journal
和highlight
列。要计算每个DESWC
的{{1}}的平均值和标准差,我会
journal
现在我绘制一个水平条形图,沿x轴的值为avg <- aggregate(DESWC ~ journal, data = mydataAll, mean)
stddev <- aggregate(DESWC ~ journal, data = mydataAll, sd)
,沿y轴的值为DESWC
。但对于每个journal
,我想用简单的线表示标准偏差和平均值。这是我目前的代码和结果。
journal
查看图像底部的三个水平geom_segments指示传播?我希望为所有stripchart2 <-
ggplot(data=mydataAll, aes(x=mydataAll$DESWC, y=mydataAll$journal, color=highlight)) +
geom_segment(aes(x=avg[1,2] - stddev[1,2],
y = avg[1,1],
xend=avg[1,2] + stddev[1,2],
yend = avg[1,1]), color="gray78") +
geom_segment(aes(x=avg[2,2] - stddev[2,2],
y = avg[2,1],
xend=avg[2,2] + stddev[2,2],
yend = avg[2,1]), color="gray78") +
geom_segment(aes(x=avg[3,2] - stddev[3,2],
y = avg[3,1],
xend=avg[3,2] + stddev[3,2],
yend = avg[3,1]), color="gray78") +
geom_point(size=3, aes(alpha=highlight)) +
scale_x_continuous(limit=x_axis_range) +
scale_y_discrete(limits=mydataAll$journal) +
scale_alpha_discrete(range = c(1.0, 0.5), guide='none')
show(stripchart2)
做到这一点,但不需要手工制作每个journals
。我尝试了using the solution from this question,但是当我把所有内容都放在一个循环中并删除了aes()时,它会给我一个错误:
Error in x - from[1] : non-numeric argument to binary operator
任何人都可以帮我压缩geom_segment()语句吗?
答案 0 :(得分:2)
我生成了一些虚拟数据来演示。首先,我们像您一样使用aggregate
,然后我们将这些结果组合在一起创建data.frame
,我们在其中创建upper
和lower
列。然后,我们将这些传递给指定新数据集的geom_segment
。另外,我将x
指定为字符变量,将y
指定为数字变量,然后使用coord_flip()
:
library(ggplot2)
set.seed(123)
df <- data.frame(lets = sample(letters[1:8], 100, replace = T),
vals = rnorm(100),
stringsAsFactors = F)
means <- aggregate(vals~lets, data = df, FUN = mean)
sds <- aggregate(vals~lets, data = df, FUN = sd)
df2 <- data.frame(means, sds)
df2$upper = df2$vals + df2$vals.1
df2$lower = df2$vals - df2$vals.1
ggplot(df, aes(x = lets, y = vals))+geom_point()+
geom_segment(data = df2, aes(x = lets, xend = lets, y = lower, yend = upper))+
coord_flip()+theme_bw()