Ich habe den Code, der ein Boxplot erstellt, mit ggplot in R, ich möchte meine Ausreißer mit dem Jahr und der Schlacht kennzeichnen.
Hier ist mein Code zum Erstellen meines Boxplots
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")
Kann jemand helfen? Ich wusste, dass dies richtig ist, ich möchte nur die Ausreißer kennzeichnen.
Das Folgende ist eine reproduzierbare Lösung, die dplyr
und das eingebaute mtcars
-Datensatz verwendet.
Gehen Sie den Code durch: Erstellen Sie zunächst eine Funktion is_outlier
, die einen booleschen TRUE/FALSE
zurückgibt, wenn der übergebene Wert ein Ausreißer ist. Wir führen dann die "Analyse/Prüfung" durch und zeichnen die Daten auf - zuerst group_by
unsere Variable (cyl
in diesem Beispiel, in Ihrem Beispiel wäre dies PortugesOutcome
) und wir fügen eine Variable outlier
im Aufruf von mutate
(Wenn die Variable drat
ein Ausreißer ist [beachten Sie, dass dies RatioPort2Dutch
in Ihrem Beispiel entspricht], übergeben wir den Wert drat
, andernfalls kehren wir zurück NA
(damit der Wert nicht dargestellt wird). Zum Schluss zeichnen wir die Ergebnisse und die Textwerte mit geom_text
und einem ästhetischen Label, das unserer neuen Variablen entspricht. Außerdem versetzen wir den Text mit hjust
(schieben Sie ihn etwas nach rechts), so dass wir die Werte neben den Ausreißerpunkten und nicht darüber sehen können.
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)
Geht das für dich?
library(ggplot2)
library(data.table)
#generate some data
set.seed(123)
n=500
dat <- data.table(group=c("A","B"),value=rnorm(n))
ggplot definiert einen Ausreißer standardmäßig als etwas, das> 1,5 * IQR vom Rahmen der Box ist.
#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)
Ausreißer mit Namensnamen kennzeichnen (basierend auf JasonAizkalns answer)
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)
Sie können dies einfach in ggplot
selbst tun, indem Sie ein entsprechendes stat_summary
Anruf.
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
)
Eine ähnliche Antwort wie oben, jedoch werden Ausreißer direkt von ggplot2
abgerufen, wodurch mögliche Konflikte in der Methode vermieden werden:
# 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)