我有使用R中的ggplot创建箱形图的代码,我想用年份和战役标记异常值。
这是我的代码来创建我的箱线图
require(ggplot2)
ggplot(seabattle, aes(x=PortugesOutcome,y=RatioPort2Dutch ),xlim="OutCome",
y="Ratio of Portuguese to Dutch/British ships") +
geom_boxplot(outlier.size=2,outlier.colour="green") +
stat_summary(fun.y="mean", geom = "point", shape=23, size =3, fill="pink") +
ggtitle("Portugese Sea Battles")
有人可以帮忙吗?我知道这是正确的,我只想标记异常值。
最佳答案
以下是使用dplyr
和内置mtcars
数据集的可重现解决方案。
遍历代码:首先,创建一个函数is_outlier
,如果传递给它的值是异常值,则它将返回 bool(boolean) TRUE/FALSE
。然后,我们执行“分析/检查”并绘制数据-首先,我们对变量group_by
(在本示例中为cyl
,在您的示例中为PortugesOutcome
),然后在对outlier
的调用中添加变量mutate
(如果drat
变量是一个离群值(请注意,在您的示例中,此变量与RatioPort2Dutch
相对应),我们将传递drat
值,否则将返回NA
以便不绘制该值)。最后,我们绘制结果并通过geom_text
和与我们的新变量相等的美观标签来绘制文本值;另外,我们使用hjust
偏移文本(向右滑动文本),以便我们可以在离群点旁边而不是在离群点之上看到值。
library(dplyr)
library(ggplot2)
is_outlier <- function(x) {
return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}
mtcars %>%
group_by(cyl) %>%
mutate(outlier = ifelse(is_outlier(drat), drat, as.numeric(NA))) %>%
ggplot(., aes(x = factor(cyl), y = drat)) +
geom_boxplot() +
geom_text(aes(label = outlier), na.rm = TRUE, hjust = -0.3)