web-dev-qa-db-fra.com

Étiquetage des valeurs aberrantes des boîtes à moustaches en R

J'ai le code qui crée une boîte à moustaches, en utilisant ggplot dans R, je veux étiqueter mes aberrantes avec l'année et Battle. 

Voici mon code pour créer ma boîte à moustaches

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")

Quelqu'un peut-il aider? Je savais que c'était correct, je voulais juste étiqueter les personnes éloignées. 

12
Deborah_Watson

Ce qui suit est une solution reproductible qui utilise dplyr et le jeu de données intégré mtcars

Parcourir le code: Tout d'abord, créez une fonction, is_outlier, qui retournera un booléen TRUE/FALSE si la valeur qui lui est transmise est une valeur aberrante. Nous effectuons ensuite "l'analyse/vérification" et traçons les données - d'abord nous group_by notre variable (cyl dans cet exemple, dans votre exemple, ce serait PortugesOutcome) et nous ajoutons une variable outlier dans l'appel à mutate (si drat variable est une valeur aberrante [notez que ceci correspond à RatioPort2Dutch dans votre exemple], nous allons passer la valeur drat, sinon nous renverrons NA de sorte que la valeur ne soit pas tracée). Enfin, nous traçons les résultats et traçons les valeurs de texte via geom_text et une étiquette esthétique égale à notre nouvelle variable; De plus, nous avons compensé le texte (faites-le glisser un peu à droite) avec hjust afin de pouvoir voir les valeurs en regard des points aberrants plutôt qu'en haut.

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

Est-ce que ça marche pour toi?

library(ggplot2)
library(data.table)

#generate some data
set.seed(123)
n=500
dat <- data.table(group=c("A","B"),value=rnorm(n))

ggplot définit une valeur aberrante par défaut comme quelque chose qui est> 1,5 * IQR à partir des bordures de la boîte.

#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

Pour étiqueter les aberrants avec des noms de noms (basé sur 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

Réponse similaire à ci-dessus, mais obtient les valeurs aberrantes directement à partir de ggplot2, évitant ainsi tout conflit potentiel dans la méthode:

# 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