Коробчатая диаграмма с выбросами для всех переменных с процентилем в R

В моем наборе данных

comp=structure(list(MYCT = c(125L, 29L, 29L, 29L, 29L, 26L, 23L, 23L, 
23L, 23L, 400L, 400L), MMIN = c(256L, 8000L, 8000L, 8000L, 8000L, 
8000L, 16000L, 16000L, 16000L, 32000L, 1000L, 512L), MMAX = c(6000L, 
32000L, 32000L, 32000L, 16000L, 32000L, 32000L, 32000L, 64000L, 
64000L, 3000L, 3500L), CACH = c(256L, 32L, 32L, 32L, 32L, 64L, 
64L, 64L, 64L, 128L, 0L, 4L), CHMIN = c(16L, 8L, 8L, 8L, 8L, 
8L, 16L, 16L, 16L, 32L, 1L, 1L), CHMAX = c(128L, 32L, 32L, 32L, 
16L, 32L, 32L, 32L, 32L, 64L, 2L, 6L), PRP = c(198L, 269L, 220L, 
172L, 132L, 318L, 367L, 489L, 636L, 1144L, 38L, 40L), ERP = c(199L, 
253L, 253L, 253L, 132L, 290L, 381L, 381L, 749L, 1238L, 23L, 24L
)), .Names = c("MYCT", "MMIN", "MMAX", "CACH", "CHMIN", "CHMAX", 
"PRP", "ERP"), class = "data.frame", row.names = c(NA, -12L))

У меня есть 8 переменных. Мне нужно получить boxplot , где выбросы обозначены красным кружком и есть шкала с процентилями. Теперь я просто пишу

boxplot(comp$MMIN)

но этот сюжет без выбросов. Я ожидаю что-то вроде этого ожидаемый сюжет

Например, на этом рисунке я вижу два выброса выше 75 процентиля. И эти графики мне нужны для каждых 8 варов. Как это выполнить?


person varimax    schedule 28.05.2018    source источник
comment
Если он построен без выбросов, возможно, в comp$MMIN нет выбросов. Что касается диаграммы с 8 переменными, попробуйте boxplot(comp).   -  person Rui Barradas    schedule 28.05.2018
comment
@RuiBarradas, я знаю этот трюк, но как я могу визуализировать выбросы, как я хочу, с процентильной шкалой?   -  person varimax    schedule 28.05.2018
comment
твой рисунок неправильный. 50% — это медиана (большая черная линия). 75% — это верхний край прямоугольника.   -  person Andre Elrico    schedule 28.05.2018
comment
@AndreElrico, да, это так. Я просто хочу показать то, что мне нужно, этот масштаб был выполнен в краске, конечно, это неправильный вид.   -  person varimax    schedule 28.05.2018
comment
Почему вы думаете, что есть выбросы? См. rdocumentation.org/packages/grDevices/versions/3.5. .0/topics/, чтобы узнать, как рассчитываются поля, усы и выбросы. Следовательно, для вашего вектора MMIN нет выбросов.   -  person Weihuang Wong    schedule 28.05.2018
comment
использовать: ggplot2 geom_boxplot. небольшой пример. Красные выбросы не проблема. Но ваша шкала будет немного неудобной. Вам нужно будет рисовать линии, галочки и аннотировать числа вручную. Также вам нужно будет заранее рассчитать позиции по оси y.   -  person Andre Elrico    schedule 28.05.2018
comment
маленький совет. Я считаю, что диаграммы расположены в точке x = 1. Таким образом, x = 0,5 - это хороший x для вашей вертикальной процентильной линии. (проб и ошибок в этих вещах, конечно)   -  person Andre Elrico    schedule 28.05.2018
comment
@AndreElrico спасибо, например, но ggplot(mpg, aes(x=class, y=hwy)) как мне обойтись без класса на x. Только метрические переменные в этом примере миль на галлон   -  person varimax    schedule 28.05.2018


Ответы (2)


ни в коем случае не готовое решение, но это должно помочь вам.

off=0.55
ggplot() + 
    geom_boxplot(data=comp,
        aes(x="",y=MMIN),
        # custom outliers
        outlier.colour="red",
        outlier.fill="red",
        outlier.size=3
    ) +
    geom_line(aes(x=c(off,off),y=c(5000,20000))) +
    geom_text(aes(x=c(off,off),y=c(5000,20000),label=c("needs to", "be calculated")))
person Andre Elrico    schedule 28.05.2018

Вот возможное решение с использованием базовой графики. Ключевым моментом является подавление оси Y, а затем добавление делений на основе сводной статистики.

#build the box plot and surpress the y axis lables 
b<-boxplot(comp$MMIN, yaxt="n", range=1.1)
points(x=rep(1, nrow(comp)), y=comp$MMIN)
#highlight outliers
points(x=rep(1, length(b$out)), y=b$out, col="red", pch=19)

#get the points for the y axis
myscale<-summary(comp$MMIN)
#remove the median
myscale<-myscale[-3]
#add the y-axis
axis(2, b$stats, labels=c(0, 25, 50, 75, 100))

#use this option for labels on both the right and left side
b<-boxplot(comp$MMIN, outline = FALSE)
axis(4, b$stats, labels=c(0, 25, 50, 75, 100))

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

person Dave2e    schedule 28.05.2018
comment
Андре, может быть, это решение имеет смысл. Я думаю, что задал действительно сложный вопрос. возможно ли, чтобы выбросы на графике удалялись из набора данных? Что Dave2e думает об этой возможности? - person varimax; 28.05.2018
comment
@varimax Это делает то, что вы хотите, но как вы можете сделать это для 8 столбцов? Квантиль будет отличаться от столбца к столбцу. Если вы не используете par(mfrow = c(2, 4)) и не рисуете один раз. - person Rui Barradas; 28.05.2018
comment
Мне нужен график с выбросом, чтобы удалить его - person varimax; 28.05.2018
comment
Я сделал все возможное, чтобы интерпретировать ваше желаемое решение на основе опубликованных данных и примера. Если это не так, пожалуйста, уточните вопрос. Каково ваше определение аутсайдера. - person Dave2e; 28.05.2018
comment
Dave2e, это просто. теперь мы видим 5 кругов выбросов (правильно?). Как я могу удалить его из моего набора данных? - person varimax; 28.05.2018
comment
@Dave2e тоже не уверен, чего ты хочешь. Удачи. - person Andre Elrico; 28.05.2018