簡體   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