web-dev-qa-db-de.com

Ausreißer von Boxplots in R kennzeichnen

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. 

12
Deborah_Watson

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)

 Boxplot

20
JasonAizkalns

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)

 enter image description here

7
Heroka

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)

 boxplot with outliers name

6
qfazille

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
  )

enter image description here

2
Axeman

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)

 enter image description here

1
jtr13