![](/img/trans.png)
[英]boxplot of all columns of a matrix with ggplot and geom_boxplot() via 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.