繁体   English   中英

ggplot geom_boxplot 中间 aes 没有效果

[英]ggplot geom_boxplot middle aes no effect

我正在尝试使用 ggplot2 绘制箱线图。 我想改变中间的意思。

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

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

library(ggplot2)
library(tidyverse)

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

它没有效果。

图形绘制的意思: 在此处输入图片说明

使用默认中位数绘制图形: 在此处输入图片说明

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

使用另一个数据集mtcars显示相同的内容,定义middle不会改变它。 而且那个在均值与中位数上有一些更大的差异。 另一种选择是使用stat_summary ,尽管我无法让 points 函数恰到好处地工作,并且不得不对其进行调整,以免得到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")

与不使用定义的middle的普通geom_boxplot相比。

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")

最后,我不得不创建一个摘要 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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM