创建自定义geom以计算摘要统计信息并在*绘图区域

时间:2016-10-12 07:42:27

标签: r ggplot2 envstats

我是R包EnvStats的创建者。

我经常使用一种名为stripChart的函数。我刚刚开始学习ggplot2,过去几天一直在研究Hadley的书,Winston的书,StackOverflow和其他资源,试图创建一个近似于geom的书。 stripChart。我无法弄清楚如何在geom内计算汇总统计数据和测试结果,然后将它们放在x轴刻度线下方,也放在绘图顶部(绘图区域外)。以下是使用内置数据集mtcars的简单示例:

library(EnvStats)
stripChart(mpg ~ cyl, data = mtcars, col = 1:3, 
  xlab = "Number of Cylinders", ylab = "Miles per Gallon", p.value = TRUE)

以下是尝试重现stripChart大部分功能的geom早期草稿:

geom_stripchart <- 
function(..., x.nudge = 0.3, 
  jitter.params = list(width = 0.3, height = 0), 
  mean.params = list(size = 2, position = position_nudge(x = x.nudge)), 
  errorbar.params = list(size = 1, width = 0.1, 
  position = position_nudge(x = x.nudge)), 
  n.text = TRUE, mean.sd.text = TRUE, p.value = FALSE) {
    params <- list(...)
    jitter.params   <- modifyList(params, jitter.params)
    mean.params     <- modifyList(params, mean.params)
    errorbar.params <- modifyList(params, errorbar.params)

    jitter <- do.call("geom_jitter", jitter.params)
    mean   <- do.call("stat_summary", modifyList(
      list(fun.y = "mean", geom = "point"), 
      mean.params)
    )
    errorbar <- do.call("stat_summary", modifyList(
      list(fun.data = "mean_cl_normal", geom = "errorbar"), 
      errorbar.params)
    )

    stripchart.list <- list(
      jitter, 
      theme(legend.position = "none"),
      mean, 
      errorbar
    )

    if(n.text || mean.sd.text) {
# Compute summary statistics (sample size, mean, SD) here?
      if(n.text) {
# Add information to stripchart.list to 
# compute sample size per group and add text below x-axis
      }
      if(mean.sd.text) {
# Add information to stripchart.list to 
# compute mean and SD and add text above top of plotting region
      }
    }
    if(p.value) {
# Add information to stripchart.list to 
# compute p-value (and 95% CI for difference if only 2 groups) 
# and add text above top of plotting region
    }
    stripchart.list
}


library(ggplot2)
dev.new()
p <- ggplot(mtcars, aes(x = factor(cyl), y = mpg, color = factor(cyl)))
p + geom_stripchart() + 
    xlab("Number of Cylinders") + 
    ylab("Miles per Gallon")

你可以看到这些情节几乎相同。我遇到的问题是如何在每组下面添加样本量,并在顶部添加均值和标准偏差,以及ANOVA检验的结果(忽略此时不等方差的问题) 。我知道计算摘要统计数据然后将它们绘制为点或文本绘图区域内是直截了当的,但我不想这样做。

我已经找到了一些示例,说明如何将文本放在图表之外(例如,使用annotation_custom()):
How can I add annotations below the x axis in ggplot2?

Displaying text below the plot generated by ggplot2

问题在于示例显示了如何在用户预定义注释的位置执行此操作。我的问题是,在geom_stripchart内,我必须根据调用ggplot()中定义的数据计算摘要统计信息和测试结果,然后将这些结果传递给annotation_custom()。我不知道如何获得ggplot()调用中定义的x和y变量。

1 个答案:

答案 0 :(得分:1)

我在这里发布了一个更简单的问题版本:ggplot2: Adding sample size information to x-axis tick labels

我更新了EnvStats包,其中包含名为geom的{​​{1}},geom_stripchartEnvStats函数stripChart的改编版。有关详细信息和示例列表,请参阅geom_stripchart library(ggplot2) library(EnvStats) p <- ggplot(mtcars, aes(x = factor(cyl), y = mpg, color = factor(cyl))) p + geom_stripchart(test.text = TRUE) + labs(x = "Number of Cylinders", y = "Miles per Gallon") 。以下是一个简单的例子:

{{1}}

help file