примените дрожание к данным выбросов в коробчатой ​​диаграмме с помощью ggplot2

у вас есть идеи, как применить дрожание только к выбросам данных коробчатой ​​диаграммы? Это код:

ggplot(data = a, aes(x = "", y = a$V8)) +
geom_boxplot(outlier.size = 0.5)+
geom_point(data=a, aes(x="", y=a$V8[54]), colour="red", size=3) + 
theme_bw()+
coord_flip()

Спасибо!!


person Jack    schedule 23.05.2017    source источник
comment
Вы можете привести воспроизводимый пример?   -  person A Gore    schedule 23.05.2017


Ответы (2)


Добавлен вектор к вашему набору данных, чтобы указать, какие точки являются, а какие нет. Затем установите geom_boxplot, чтобы не отображать выбросы, и используйте geom_point, чтобы отобразить явные выбросы.

Я буду использовать diamonds набор данных из ggplot2 для иллюстрации.

library(ggplot2)
library(dplyr)

diamonds2 <-
  diamonds %>%
  group_by(cut) %>%
  mutate(outlier = price > median(price) + IQR(price) * 1.5) %>%
  ungroup

ggplot(diamonds2) +
  aes(x = cut, y = price) +
  geom_boxplot(outlier.shape = NA) +  # NO OUTLIERS
  geom_point(data = function(x) dplyr::filter_(x, ~ outlier), position = 'jitter') # Outliers

введите описание изображения здесь

person Peter    schedule 23.05.2017
comment
Я никогда не видел, чтобы в аргументе data = использовалась функция; Это блестяще! - person Brian; 24.05.2017
comment
значение по умолчанию для выброса немного выключено, поэтому точки перекрывают усы ... используйте: outlier.high = V8 > quantile(V8, .75) + 1.50*IQR(V8) и outlier.low = V8 < quantile(V8, .25) - 1.50*IQR(V8)). Затем можно добавить geom_jitter(data = filter(a, outlier.high ==T | outlier.low == T), color = "red", width = .2) - person Matt L.; 24.05.2017
comment
Чтобы немного расширить комментарий Мэтта Л. (который рассматривается в их ответе): спецификация Питера для порогового значения внешнего значения немного отличается от соглашения Тьюки. По соглашению Тьюки верхний / нижний квартиль + - 1,5 * IQR, но Питер использует медианное значение + - 1,5 * IQR. Ответ Питера также касается только чрезвычайно высоких значений и игнорирует чрезвычайно маленькие значения. - person Bradford; 03.01.2021

Этот подход немного отличается от описанного выше (назначает цветовую переменную с NA для не выпадающих значений) и включает поправку для вычислений верхней и нижней границ.

Определение «выброса» по умолчанию - это точка за 25/75 квартилем +/- 1,5 x межквартильный размах (IQR).

Сгенерируйте некоторые образцы данных:

set.seed(1)
a <- data_frame(x= factor(rep(1:4, each  = 1000)),
                V8 = c(rnorm(1000, 25, 4), 
                       rnorm(1000, 50, 4),
                       rnorm(1000, 75, 4),
                       rnorm(1000, 100, 4)))

вычислить выбросы верхнего / нижнего предела (использует функции dplyr / tidyverse):

library(tidyverse)
a <- a %>% group_by(x) %>% 
  mutate(outlier.high = V8 > quantile(V8, .75) + 1.50*IQR(V8),
         outlier.low = V8 < quantile(V8, .25) - 1.50*IQR(V8))

Определите цвет для верхней / нижней точки:

a <- a %>% mutate(outlier.color = case_when(outlier.high ~ "red",
                                       outlier.low ~ "steelblue"))

Неклассифицированные случаи будут обозначены цветом как "NA" и не будут отображаться на графике.

Функция dplyr::case_when() еще не полностью стабильна (может потребоваться версия для разработки github> 0.5 по адресу введите здесь описание ссылки), так что вот базовая альтернатива, если это не сработает:

a$outlier.color <- NA
a$outlier.color[a$outlier.high] <- "red"
a$outlier.color[a$outlier.low] <- "steelblue"

Участок:

a %>% ggplot(aes(x, V8)) + 
  geom_boxplot(outlier.shape = NA)  + 
  geom_jitter(color = a$outlier.color, width = .2) + # NA not plotted 
  theme_bw() + coord_flip()

введите описание изображения здесь

person Matt L.    schedule 23.05.2017