在R(ggplot)中注释公式(使用bqoute或替换)给出错误

时间:2017-04-06 18:12:28

标签: r ggplot2 formula annotate

我想在其中添加一个带变量的公式作为我的ggplot的注释。

regline1 <- 0.00
slope1 <- 1.00
dat <- as.data.frame(c(0,1))
dat[2] <- c(0,1)
names(dat) <- c("foo","bar")

p <-
ggplot(dat, aes(foo, bar)) + coord_fixed(ratio = 1) + geom_point()  + 
geom_abline(slope = slope1, intercept = intercept1, linetype = "dashed") +
labs(x =  substitute(y[H1]==i+s%*%x,list(i=format(intercept1, digits = 1), s= format(slope1, digits = 1))))

正如您所看到的,ggplot评估实验室的公式(x = ...)没有问题,但是如果您尝试添加注释:

p +   annotate("text",x=0.75, y = 0.25, label = substitute(y[H1]==i+s%*%x,list(i=format(intercept1, digits = 1), s= format(slope1, digits = 1))))

它会给你一个错误:

Error: Aesthetics must be either length 1 or the same as the data (1): label

我可以在annotate()中解析一个粘贴调用,如下所示:

p <- annotate("text",x= 0.75, y =0.25, label = "paste(y[H1]== intercept1+ slope1 %.%x)", parse = TRUE)

但是,这不会写变量值,因为它在引号中。引号中的substitute() - 表达式根本不会被解析。

那我怎么能这样做呢?

感谢任何帮助, 提前致谢 朱利

1 个答案:

答案 0 :(得分:2)

annotate() function does not support expressions。你需要传入一个字符串并设置parse=T

如果您首先构建表达式

myexpr <- substitute( y[H1]==i+s%*%x, list(
    i = format(intercept1, digits = 1), 
    s= format(slope1, digits = 1))
)

您可以deparse()annotate()为您重新解析

ggplot(dat, aes(foo, bar)) + 
    geom_point()  + 
    geom_abline(slope = slope1, intercept = intercept1, linetype = "dashed") +
    coord_fixed(ratio = 1) + 
    labs(x = myexpr) + 
    annotate("text",x=0.75, y = 0.25, label = deparse(myexpr), parse=TRUE)

导致

enter image description here