it-swarm.dev

R'deki Boxplots Etiketlerini Ayırma

Bir kutu grafiği oluşturan kod var, R'de ggplot kullanarak, aykırılıklarımı yıl ve Savaş ile etiketlemek istiyorum. 

İşte benim kutu grafiğimi oluşturma kodum

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

Biri yardım edebilir mi? Bunun doğru olduğunu biliyordum, sadece aykırılıkları etiketlemek istiyorum. 

12
Deborah_Watson

Aşağıdaki, dplyr ve yerleşik mtcars veri kümesini kullanan yeniden üretilebilir bir çözümdür. 

Kodda yürümek: Öncelikle, eğer kendisine verilen değer bir aykırıysa, bir boolean is_outlier döndürecek bir işlev oluşturun, TRUE/FALSE. Daha sonra "analiz/kontrol" işlemini yapar ve verileri çizeriz - ilk önce group_by değişkenimiz (cyl, bu örnekte, örneğin, bu PortugesOutcome olur) ve outlier çağrısında mutate değişkenini ekleriz (eğer drat ise değişkeni bir dışlayıcıdır [bunun örneğinizdeki RatioPort2Dutch işlevine karşılık geldiğine dikkat edin], drat değerini ileteceğiz, aksi takdirde NA değerini döndüreceğiz, böylece değer çizilmez). Son olarak, sonuçları çizeriz ve metin değerlerini geom_text ve yeni değişkenimize eşit estetik bir etiketle çizeriz; ek olarak, metni (biraz sağa doğru kaydırın) hjust ile kaydırdık, böylece outlier noktalarının üstünde değil, yanındaki değerleri görebilelim.

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

Bu senin için uygun mu?

library(ggplot2)
library(data.table)

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

ggplot, varsayılan olarak kutunun sınırlarından> 1.5 * IQR değerinde bir eksilci tanımlar.

#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

Outliers'ı rownames ile etiketlemek için (/ 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

Uygun bir stat_summary çağrısı kullanarak bunu basitçe ggplot içinde yapabilirsiniz.

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

Yukarıdakine benzer bir cevap, ancak aykırı sözcükleri doğrudan ggplot2 adresinden alır, böylece yöntemdeki olası çakışmaları önler:

# 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