我正在构建一个条形图,其中一条线连接两个条形图,以显示星号是指它们之间的区别:
使用以下代码正确构建了大部分绘图:
mytbl <- data.frame(
"var" =c("test", "control"),
"mean1" =c(0.019, 0.022),
"sderr"= c(0.001, 0.002)
);
mytbl$var <- relevel(mytbl$var, "test"); # without this will be sorted alphabetically (i.e. 'control', then 'test')
p <-
ggplot(mytbl, aes(x=var, y=mean1)) +
geom_bar(position=position_dodge(), stat="identity") +
geom_errorbar(aes(ymin=mean1-sderr, ymax=mean1+sderr), width=.2)+
scale_y_continuous(labels=percent, expand=c(0,0), limits=c(NA, 1.3*max(mytbl$mean1+mytbl$sderr))) +
geom_text(mapping=aes(x=1.5, y= max(mean1+sderr)+0.005), label='*', size=10)
p
唯一缺少的是线本身。在我的旧代码中,它应该使用以下内容:
p +
geom_line(
mapping=aes(x=c(1,1,2,2),
y=c(mean1[1]+sderr[1]+0.001,
max(mean1+sderr) +0.004,
max(mean1+sderr) +0.004,
mean1[2]+sderr[2]+0.001)
)
)
但是当我现在运行此代码时,出现错误:Error: Aesthetics must be either length 1 or the same as the data (2): x, y
。通过尝试不同的方法,我找到了一个尴尬的解决方法:我在data=rbind(mytbl,mytbl),
之前添加mapping
但我不明白这里发生了什么。
P.S。另外一个小问题(我知道,我应该在单独的SO帖子中提出,对不起) - 为什么在scale_y_continuous(..., limits())
我无法按列处理数据并且必须明确调用mytbl$
?< / p>
答案 0 :(得分:4)
将所有内容放在一个单独的数据框中:
line_data <- data.frame(x=c(1,1,2,2),
y=with(mytbl,c(mean1[1]+sderr[1]+0.001,
max(mean1+sderr) +0.004,
max(mean1+sderr) +0.004,
mean1[2]+sderr[2]+0.001)))
p + geom_line(data = line_data,aes(x = x,y = y))
一般情况下,在[
内部绘制美学时,应避免使用$
和aes()
之类的内容。使用 ggplot2 的预期方法通常是将数据调整为一种格式,使每列完全符合您的要求。
您无法在mytbl
函数中引用scale_*
中的变量,因为该数据环境不像图层一样传递。标度与数据层分开处理,因此通常假设它们的信息与您正在绘制的数据分开存在。