Ali*_*Ali 5 r ggplot2 aesthetics
我们可能想aes()为ggplot()图形定义一些全局的,但在某些层中排除它们。例如假设以下示例:
foo <- data.frame(x=runif(10),y=runif(10))
bar <- data.frame(x=c(0,1),ymin=c(-.1,.9),ymax=c(.1,1.1))
p <- ggplot(foo,aes(x=x,y=y))+geom_point()
Run Code Online (Sandbox Code Playgroud)
一切都很好。但是,当尝试添加功能区时:
p <- p + geom_ribbon(data=bar, aes(x=x,ymin=ymin,ymax=ymax), alpha=.1)
# Error: Discrete value supplied to continuous scale
Run Code Online (Sandbox Code Playgroud)
发生此错误是因为我们已经定义了y全局的一部分aes(),也适用于geom_ribbon(),但bar没有它。
我发现了两种避免此错误的可能性,其中之一是y=y从原来的中删除ggplot(foo,aes(x=x,y=y)),但是以后每次我需要绘制一些我应该添加到不好的内容y=y中。aes()
另一种可能性是添加一个假y列bar:
bar = cbind(bar, y=0)
p <- p + geom_ribbon(data=bar, aes(x=x,ymin=ymin,ymax=ymax), alpha=.1)
Run Code Online (Sandbox Code Playgroud)

现在效果很好。然而我不喜欢这样做,因为它是一个假变量。有没有办法aes()在ggplot()调用时暂时禁用已定义的geom_ribbon()?
正如 @ErnestA 的评论中所说,我们可以通过将它们设置为 NULL 来取消美学映射
aes(y=NULL,x=x,ymin=ymin,ymax=ymax)
Run Code Online (Sandbox Code Playgroud)
PS:对于图例,您现在可以通过以下方式覆盖美学aes.override