Обозначьте только выбросы в plotly boxplot [duplicate]

Для забавного применения инициализации двойной скобки см. здесь Массив Dwemthy's в Java .

Отрывок

private static class IndustrialRaverMonkey
  extends Creature.Base {{
    life = 46;
    strength = 35;
    charisma = 91;
    weapon = 2;
  }}

private static class DwarvenAngel
  extends Creature.Base {{
    life = 540;
    strength = 6;
    charisma = 144;
    weapon = 50;
  }}

И теперь, будьте готовы для BattleOfGrottoOfSausageSmells и & hellip; короткое бекон!

12
задан Heroka 4 November 2015 в 15:45
поделиться

5 ответов

С небольшим завихрением в решении @JasonAizkalns вы можете помечать выбросы своим местоположением в вашем кадре данных.

mtcars[,'row'] <- row(mtcars)[,1]
...
mutate(outlier = ifelse(is_outlier(drat), row, as.numeric(NA)))
...

Я загружаю фрейм данных в среду R Studio, поэтому я могу взять более подробно рассмотрите данные в строках outlier.

-2
ответ дан armatita 18 August 2018 в 16:29
поделиться

Чтобы обозначить выбросы с именами ростов (на основе ответа JasonAizkalns )

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)

5
ответ дан Community 18 August 2018 в 16:29
поделиться

Это работает для вас?

library(ggplot2)
library(data.table)

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

ggplot по умолчанию определяет outlier как то, что составляет> 1.5 * IQR из границ поля.

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

6
ответ дан Heroka 18 August 2018 в 16:29
поделиться

Ниже приведено воспроизводимое решение, которое использует dplyr и встроенный набор данных mtcars.

Прогулка по коду: сначала создайте функцию is_outlier, которая вернет логическое значение TRUE/FALSE, если переданное ему значение является выбросом. Затем мы выполняем «анализ / проверку» и построим данные - сначала мы group_by нашу переменную (cyl в этом примере, в вашем примере это будет PortugesOutcome), и мы добавим переменную outlier в вызов mutate (если переменная drat является outlier [обратите внимание, что это соответствует RatioPort2Dutch в вашем примере], мы передадим значение drat, в противном случае мы вернем NA, чтобы значение не было график). Наконец, мы построим результаты и построим текстовые значения через geom_text и эстетическую метку, равную нашей новой переменной; кроме того, мы компенсируем текст (сдвинем его немного вправо) с помощью hjust, чтобы мы могли видеть значения рядом с точками outlier, а не поверх них.

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)

14
ответ дан JasonAizkalns 18 August 2018 в 16:29
поделиться
0
ответ дан jtr13 30 October 2018 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: