當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。