首页 > 解决方案 > 使用`ggplot2::stat`时找不到`y`

问题描述

假设我想用以下数据绘制条形图:

df <- aggregate(Sepal.Length ~ Species, iris, mean)
#      Species Sepal.Length
# 1     setosa        5.006
# 2 versicolor        5.936
# 3  virginica        6.588

p <- ggplot(df, aes(Species, Sepal.Length)) + geom_col()

layer_data(p)
#   x     y PANEL group ymin  ymax xmin xmax colour   fill size linetype alpha
# 1 1 5.006     1     1    0 5.006 0.55 1.45     NA grey35  0.5        1    NA
# 2 2 5.936     1     2    0 5.936 1.55 2.45     NA grey35  0.5        1    NA
# 3 3 6.588     1     3    0 6.588 2.55 3.45     NA grey35  0.5        1    NA

我想在中间高度向我的酒吧添加标签,这有效:

p + geom_text(aes(y=Sepal.Length/2, label = Species), color="white")

但我不想重复Sepal.Length,所以我尝试使用stat但我得到一个错误:

p + geom_text(aes(y=stat(y)/2, label = Species), color="white")

FUN(X[[i]], ...) 中的错误:找不到对象“y”

这很奇怪,因为有些变量layer_data(p)有效,而另一些则无效,例如:

p + geom_text(aes(y=stat(x)/2, label = Species), color="white")
p + geom_text(aes(y=stat(group)/2, label = Species), color="white")

这也可以:

p <- ggplot(df, aes(Species, Sepal.Length, yy =Sepal.Length)) + geom_col()
p + geom_text(aes(y=stat(yy)/2, label = Species), color="white")

这是一个错误吗?我该如何解决这个问题?

我的配置(在 Windows 上):

R.Version()$version.string
# [1] "R version 3.3.1 (2016-06-21)"
.rs.rVersionString()
# [1] "3.3.1"
packageVersion("ggplot2")
# [1] ‘3.0.0’

标签: rggplot2

解决方案


我不确定它有多健壮,但似乎x,y并且PANEL可以通过.data代词访问。

它们以其原始名称和原始值命名,而不是 from layer_data,所以如果我不想重复,Sepal.LengthSpecies可以这样做:

p + geom_text(aes(
  y     = .data[[names(.data)[2]]]/2,
  label = .data[[names(.data)[1]]]),
  color = "white")

推荐阅读