Deb*_*son 17 r ggplot2 boxplot direct-labels
我有代码创建一个boxplot,使用R中的ggplot,我想用年份和Battle标记我的异常值.
这是我创建箱图的代码
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")
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?我知道这是正确的,我只想标记异常值.
Jas*_*lns 30
以下是使用dplyr和内置mtcars数据集的可重现解决方案.
遍历代码:首先,创建一个函数,如果传递给它的值是一个异常值is_outlier,它将返回一个布尔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)
Run Code Online (Sandbox Code Playgroud)
Axe*_*man 11
您可以ggplot使用适当的stat_summary调用在其内部简单地执行此操作。
ggplot(mtcars, aes(x = factor(cyl), y = drat, fill = factor(cyl))) +
geom_boxplot() +
stat_summary(
aes(label = round(stat(y), 1)),
geom = "text",
fun.y = function(y) { o <- boxplot.stats(y)$out; if(length(o) == 0) NA else o },
hjust = -1
)
Run Code Online (Sandbox Code Playgroud)
用rownames标记异常值(基于JasonAizkalns答案)
library(dplyr)
library(ggplot2)
library(tibble)
is_outlier <- function(x) {
return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}
dat <- mtcars %>% tibble::rownames_to_column(var="outlier") %>% group_by(cyl) %>% mutate(is_outlier=ifelse(is_outlier(drat), drat, as.numeric(NA)))
dat$outlier[which(is.na(dat$is_outlier))] <- as.numeric(NA)
ggplot(dat, aes(y=drat, x=factor(cyl))) + geom_boxplot() + geom_text(aes(label=outlier),na.rm=TRUE,nudge_y=0.05)
Run Code Online (Sandbox Code Playgroud)
这对你有用吗?
library(ggplot2)
library(data.table)
#generate some data
set.seed(123)
n=500
dat <- data.table(group=c("A","B"),value=rnorm(n))
Run Code Online (Sandbox Code Playgroud)
ggplot默认将异常值定义为从框的边界> 1.5*IQR.
#function that takes in vector of data and a coefficient,
#returns boolean vector if a certain point is an outlier or not
check_outlier <- function(v, coef=1.5){
quantiles <- quantile(v,probs=c(0.25,0.75))
IQR <- quantiles[2]-quantiles[1]
res <- v < (quantiles[1]-coef*IQR)|v > (quantiles[2]+coef*IQR)
return(res)
}
#apply this to our data
dat[,outlier:=check_outlier(value),by=group]
dat[,label:=ifelse(outlier,"label","")]
#plot
ggplot(dat,aes(x=group,y=value))+geom_boxplot()+geom_text(aes(label=label),hjust=-0.3)
Run Code Online (Sandbox Code Playgroud)
与上面类似的答案,但直接从 中获取异常值ggplot2,从而避免方法中的任何潜在冲突:
# calculate boxplot object
g <- ggplot(mtcars, aes(factor(cyl), drat)) + geom_boxplot()
# get list of outliers
out <- ggplot_build(g)[["data"]][[1]][["outliers"]]
# label list elements with factor levels
names(out) <- levels(factor(mtcars$cyl))
# convert to tidy data
tidyout <- purrr::map_df(out, tibble::as_tibble, .id = "cyl")
# plot boxplots with labels
g + geom_text(data = tidyout, aes(cyl, value, label = value),
hjust = -.3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24217 次 |
| 最近记录: |