在ggplot的`geom_line`中寻址`data`

时间:2016-03-17 21:50:19

标签: r ggplot2

我正在构建一个条形图,其中一条线连接两个条形图,以显示星号是指它们之间的区别:

sample plot

使用以下代码正确构建了大部分绘图:

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>

1 个答案:

答案 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_*中的变量,因为该数据环境不像图层一样传递。标度与数据层分开处理,因此通常假设它们的信息与您正在绘制的数据分开存在。