当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R ggplot2 aes_eval 控制审美评价


大多数aesthetics是从数据中找到的变量映射的。然而,有时您希望将映射延迟到渲染过程的后期。 ggplot2 具有三个阶段的数据,您可以从中映射美学,以及三个函数来控制在哪个阶段评估美学。

after_stat() 替换了使用 stat() 的旧方法,例如stat(density) ,或用 .. 包围变量名称,例如..density..

用法

# These functions can be used inside the `aes()` function
# used as the `mapping` argument in layers, for example:
# geom_density(mapping = aes(y = after_stat(scaled)))

after_stat(x)

after_scale(x)

stage(start = NULL, after_stat = NULL, after_scale = NULL)

参数

x

< data-masking > 使用由统计 ( after_stat() ) 或图层美学 ( after_scale() ) 计算的变量的美学表达。

start

< data-masking > 使用图层数据变量的美学表达。

after_stat

< data-masking > 使用统计数据计算的变量的美学表达。

after_scale

<data-masking> 使用图层美学的美学表达。

分期

下面概述了评估的三个阶段以及如何控制美学评估。

第一阶段:直接输入

默认是在开始时使用用户提供的图层数据进行映射。如果你想直接从图层数据映射,你不应该做任何特殊的事情。这是可以访问原始图层数据的唯一阶段。

# 'x' and 'y' are mapped directly
ggplot(mtcars) + geom_point(aes(x = mpg, y = disp))

第2阶段:统计转换后

第二阶段是数据经过图层统计转换后。从 stat 转换数据映射的最常见示例是 geom_histogram() 中的条形高度:高度并非来自基础数据中的变量,而是映射到由 stat_bin() 计算的 count 。为了从 stat 转换数据进行映射,您应该使用 after_stat() 函数来标记美学映射的评估应推迟到 stat 转换之后。统计转换后的评估将访问统计计算的变量,而不是原始映射值。每个统计数据中的 'computed variables' 部分列出了可访问的变量。

# The 'y' values for the histogram are computed by the stat
ggplot(faithful, aes(x = waiting)) +
  geom_histogram()

# Choosing a different computed variable to display, matching up the
# histogram with the density plot
ggplot(faithful, aes(x = waiting)) +
  geom_histogram(aes(y = after_stat(density))) +
  geom_density()

第三阶段:规模转型后

第三个也是最后一个阶段是在数据经过绘图比例转换和映射之后。从缩放数据进行映射的一个示例可以是使用描边颜色的去饱和版本进行填充。您应该使用 after_scale() 来标记数据缩放后的映射评估。缩放后的评估只能访问该图层的最终美观效果(包括非映射的默认美观效果)。

# The exact colour is known after scale transformation
ggplot(mpg, aes(cty, colour = factor(cyl))) +
  geom_density()

# We re-use colour properties for the fill without a separate fill scale
ggplot(mpg, aes(cty, colour = factor(cyl))) +
  geom_density(aes(fill = after_scale(alpha(colour, 0.3))))

复杂的分期

如果您想多次映射相同的美学,例如将 x 映射到 stat 的数据列,但将其重新映射到 geom,您可以使用 stage() 函数来收集多个映射。

# Use stage to modify the scaled fill
ggplot(mpg, aes(class, hwy)) +
  geom_boxplot(aes(fill = stage(class, after_scale = alpha(fill, 0.4))))

# Using data for computing summary, but placing label elsewhere.
# Also, we're making our own computed variable to use for the label.
ggplot(mpg, aes(class, displ)) +
  geom_violin() +
  stat_summary(
    aes(
      y = stage(displ, after_stat = 8),
      label = after_stat(paste(mean, "±", sd))
    ),
    geom = "text",
    fun.data = ~ round(data.frame(mean = mean(.x), sd = sd(.x)), 2)
  )

例子

# Default histogram display
ggplot(mpg, aes(displ)) +
  geom_histogram(aes(y = after_stat(count)))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


# Scale tallest bin to 1
ggplot(mpg, aes(displ)) +
  geom_histogram(aes(y = after_stat(count / max(count))))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


# Use a transparent version of colour for fill
ggplot(mpg, aes(class, hwy)) +
  geom_boxplot(aes(colour = class, fill = after_scale(alpha(colour, 0.4))))


# Use stage to modify the scaled fill
ggplot(mpg, aes(class, hwy)) +
  geom_boxplot(aes(fill = stage(class, after_scale = alpha(fill, 0.4))))


# Making a proportional stacked density plot
ggplot(mpg, aes(cty)) +
  geom_density(
    aes(
      colour = factor(cyl),
      fill = after_scale(alpha(colour, 0.3)),
      y = after_stat(count / sum(n[!duplicated(group)]))
    ),
    position = "stack", bw = 1
  ) +
  geom_density(bw = 1)


# Imitating a ridgeline plot
ggplot(mpg, aes(cty, colour = factor(cyl))) +
  geom_ribbon(
    stat = "density", outline.type = "upper",
    aes(
      fill = after_scale(alpha(colour, 0.3)),
      ymin = after_stat(group),
      ymax = after_stat(group + ndensity)
    )
  )


# Labelling a bar plot
ggplot(mpg, aes(class)) +
  geom_bar() +
  geom_text(
    aes(
      y = after_stat(count + 2),
      label = after_stat(count)
    ),
    stat = "count"
  )


# Labelling the upper hinge of a boxplot,
# inspired by June Choe
ggplot(mpg, aes(displ, class)) +
  geom_boxplot(outlier.shape = NA) +
  geom_text(
    aes(
      label = after_stat(xmax),
      x = stage(displ, after_stat = xmax)
    ),
    stat = "boxplot", hjust = -0.5
  )

源代码:R/aes-evaluation.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Control aesthetic evaluation。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。