【问题标题】:ggplot geom_boxplot middle aes no effectggplot geom_boxplot 中间 aes 没有效果
【发布时间】:2018-10-30 01:39:09
【问题描述】:

我正在尝试用 ggplot2 绘制箱线图。我想把中间改成意思。

我知道以前有人问过类似的问题,但我问这个是因为该解决方案对我不起作用。具体来说,我遵循了这个公认的answer中的第一个解决方案@

这就是我对 mpg 测试数据所做的:

library(ggplot2)
library(tidyverse)

mpg %>%
  ggplot(aes(x = class, y = cty, middle = mean(cty))) +
  geom_boxplot()

没有效果。

绘图的意思是:

使用默认中值绘制图形:

谁能帮忙指出我做错了什么?谢谢。

【问题讨论】:

  • 实际上,如果您仔细查看链接的答案,middle = mean() 调用在 geom_boxplot(aes()) 调用内部,而不是 ggplot 调用。尝试将其转移到boxplot 调用,因为我认为ggplot 本身不存在middle 规范。
  • aes 可以在geom_boxplotggplot 内部调用(在这种情况下它由所有布局共享)。我都试过了,虽然它真的不应该有什么不同,但它没有。
  • 另一种选择是平均值和中位数在所有情况下都非常相似。试试这个:tapply(mpg$cty, mpg$class, summary)
  • @bob1 你说得对,他们中的大多数都非常接近。但至少有一个类别,即次紧凑型,其均值 (20.37) 与中值 (19) 有很大不同。我尝试使用其他功能(例如 max),但没有任何效果。开始认为链接的解决方案是错误的。知道不为此创建新的 df 会有什么解决方案吗?
  • @EJ2015 如果你还在寻找解决方案,我刚刚回答了一个有点类似的问题here。解决方案 2 可能会根据您的用例进行修改。

标签: r ggplot2 boxplot


【解决方案1】:

与另一个数据集mtcars 混在一起显示了同样的事情,定义middle 并不会改变它。而那个在均值和中位数上有一些更大的差异。另一种选择是使用stat_summary,尽管我无法让点函数正常工作,并且不得不对其进行调整以免出现arguments imply differing number of rows: 1, 0 错误。

BoxMeanQuant <- function(x) {
    v <- c(min(x), quantile(x, 0.25), mean(x), quantile(x, 0.75), max(x))
    names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
    v
  }

mpg %>%
  ggplot(aes(x = class, y = cty)) +
  stat_summary(fun.data = BoxMeanQuant, geom = "boxplot")

与普通的geom_boxplot相比,没有使用定义的middle

mpg %>% 
  ggplot(aes(x = class, y = cty)) +
  geom_boxplot(aes(middle = mean(cty)))

这是我用来将异常值绘制为点的方法,但它们与 geom_boxplot 的默认值不同。您可以根据需要进行调整。不使用if-else 会抛出错误。

BoxMeanQuant <- function(x) {
  v <- c(quantile(x, 0.1), quantile(x, 0.25), mean(x), quantile(x, 0.75), quantile(x, 0.9))
  names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
  v
}

outliers <- function(x) {
  if (length(x) > 5) {
  subset(x, x < quantile(x, 0.1) | quantile(x, 0.9) < x)
  } else {
    return(NA)
  }
}

ggplot(data = mpg, aes(x = class, y = cty)) +
stat_summary(fun.data = BoxMeanQuant, geom = "boxplot") +
stat_summary(fun.y = outliers, geom = "point")

【讨论】:

  • 感谢您展示如何使用 stat_summary 执行此操作。
【解决方案2】:

最后,我必须创建一个摘要 df 来执行此操作。这不是我最初想要的,但它确实有效。

df <- mpg %>%
  group_by(class) %>%
  summarize(ymin = min(cty), ymax = max(cty), lower = quantile(cty, 0.25), upper = quantile(cty, 0.75), middle = mean(cty)) 

df %>%
  ggplot(aes(class)) +
  geom_boxplot(aes(ymin = ymin, ymax = ymax, lower = lower, upper = upper, middle = middle), stat = 'identity')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2020-11-06
    • 2013-02-25
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多