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