2014-02-03 2 views
11

У меня есть некоторые данные here [в .txt файла], который я прочитал в кадре данных DF,Удалить выбросы полностью из нескольких сделанных с присуща рефлективными, вербального ggplot2 в R и отображения присущи рефлективные, вербальных расширенного формат

df <- read.table("data.txt", header=T,sep="\t") 

I удалить отрицательные значения в столбце x (так как мне нужно только положительные значения) на df, используя следующий код,

yp <- subset(df, x>0) 

Теперь я хочу построить несколько участков окна в том же слое. Сначала я расплавляю фрейм данных df, и результат графика содержит несколько выбросов, как показано ниже.

# Melting data frame df  
df_mlt <-melt(df, id=names(df)[1]) 
    # plotting the boxplots 
    plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) + 
     geom_boxplot(aes(color=factor(ID1))) + 
     scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) +  
     theme_bw() + 
     theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+ 
     theme(axis.text=element_text(size=20)) + 
     theme(axis.title=element_text(size=20,face="bold")) + 
     labs(x = "x", y = "y",colour="legend") + 
     annotation_logticks(sides = "rl") + 
     theme(panel.grid.minor = element_blank()) + 
     guides(title.hjust=0.5) + 
     theme(plot.margin=unit(c(0,1,0,0),"mm")) 
    plt_wool 

Boxplot with outliers

Теперь мне нужно иметь участок без каких-либо выбросов, поэтому сделать это первым, я вычислить нижнюю и верхнюю границу усов я использую следующий код, как было предложено here,

sts <- boxplot.stats(yp$x)$stats 

Чтобы удалить выхлоп, я добавлю нижний нижний и нижний пределы усов, как показано ниже,

p1 = plt_wool + coord_cartesian(ylim = c(sts*1.05,sts/1.05)) 

Полученный график показан ниже, в то время как приведенная выше строка кода правильно удаляет большинство верхних выбросов, все нижние выбросы все еще остаются. Может кто-нибудь, пожалуйста, предложите, как полностью удалить весь выброс из этого участка, спасибо.

enter image description here

ответ

11

На основе предложений по @Sven Хоэнштайна, @Roland и @lukeA я решил эту проблему для отображения нескольких присущи рефлективных, вербальных развернутого вид без выбросов.

Первый участок в окно участки без выбросов с помощью outlier.colour=NA в geom_boxplot()

plt_wool <- ggplot(subset(df_mlt, value > 0), aes(x=ID1,y=value)) + 
    geom_boxplot(aes(color=factor(ID1)),outlier.colour = NA) + 
    scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) + 
    theme_bw() + 
    theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+ 
    theme(axis.text=element_text(size=20)) + 
    theme(axis.title=element_text(size=20,face="bold")) + 
    labs(x = "x", y = "y",colour="legend") + 
    annotation_logticks(sides = "rl") + 
    theme(panel.grid.minor = element_blank()) + 
    guides(title.hjust=0.5) + 
    theme(plot.margin=unit(c(0,1,0,0),"mm")) 

Затем вычисляем нижние, верхние усы, используя boxplot.stats() как код ниже. Поскольку я принимаю только положительные значения, я выбираю их, используя условие в subset().

yp <- subset(df, x>0)    # Choosing only +ve values in col x 
sts <- boxplot.stats(yp$x)$stats # Compute lower and upper whisker limits 

Теперь для достижения полного расширенного представления множества присуща рефлективными, вербальных, полезно изменить предел оси у участка внутри coord_cartesian() функции, как показано ниже,

p1 = plt_wool + coord_cartesian(ylim = c(sts[2]/2,max(sts)*1.05)) 

Примечания: Пределов of y следует отрегулировать в соответствии с конкретным случаем. В этом случае я выбрал половину нижнего предела нити для ymin.

Полученный участок находится ниже,

+1

Отвлечение внимания в этом в противном случае хороший ответ –

+0

Отличный ответ. Такое простое исправление, использующее outlier.colour = NA – Seanosapien

3

Вы можете сделать выпадающие невидимым с аргументом outlier.colour = NA:

geom_boxplot(aes(color = factor(ID1)), outlier.colour = NA) 
+0

Для Sven Хоэнштайн и @Roland Проблема с удалением выбросов таким образом здесь заключается в том, что ящики в коробке все еще остаются смятыми. То, что я хотел бы иметь, - это коробки в коробке в расширенной форме, как показано на рисунке 2 моего вопроса, но без выбросов. – Amm

+0

Я решил проблему (см. Выше ответ) в отношении расширения ящика после удаления выбросов. – Amm

15

Минимальная воспроизводимая пример:

library(ggplot2) 
p <- ggplot(mtcars, aes(factor(cyl), mpg)) 
p + geom_boxplot() 

Не черчения Выпадающие:

p + geom_boxplot(outlier.shape=NA) 
#Warning message: 
#Removed 3 rows containing missing values (geom_point). 

(Я предпочитаю получить это предупреждение, потому что через год с длинным сценарием он напомнит мне, что я сделал там что-то особенное. Если вы хотите, чтобы избежать его использовать решение Свена.)

+3

Это хороший способ, однако, ограничение Y не изменяется, и поэтому фигура не выглядит хорошо с большим белым пространством в верхней части. –

3
ggplot(df_mlt, aes(x = ID1, y = value)) + 
    geom_boxplot(outlier.size = NA) + 
    coord_cartesian(ylim = range(boxplot(df_mlt$value, plot=FALSE)$stats)*c(.9, 1.1)) 
+1

. Это удаляет выбросы сверху и снизу, но в итоге получается единый прямоугольник. Мне нужно несколько ящиков, хотя я решил это сейчас, спасибо. – Amm

2

Другой способ исключить выбросы, чтобы вычислить их потом установить у-ограничение на то, что вы считаете особняком.

Например, если ваши верхние и нижние пределы Q3 + 1.5 IQR и Q1 - 1.5 IQR, то вы можете использовать:

upper.limit <- quantile(x)[4] + 1.5*IQR(x) 
lower.limit <- quantile(x)[2] - 1.5*IQR(x) 

Затем положить ограничения на диапазон оси у:

ggplot + coord_cartesian(ylim=c(lower.limit, upper.limit)) 
+0

как OP, включенное в их вопрос, это решение не подходит для проблемы – deeenes