2012-10-20 2 views
31

Я бы хотел поставить перпендикулярные линии на концах усов, как функция boxplot автоматически дает.Положить концы усов на коробку

+1

вы можете сделать это путем расчета квантиля, где ggplot рисует линию и рисунка своего собственного 'geom_segment' или' geom_crossbar'. см. [этот вопрос] (http://stats.stackexchange.com/questions/8137/how-to-add-horizontal-lines-to-ggplot2-boxplot) – Justin

+1

Есть ли причина, почему это должно быть сделано в ggplot2, и не используя 'boxplot', который уже делает то, что вы хотите, или это вопрос чисто академического интереса ...? –

+0

@ Justin Спасибо, я проверил этот вопрос, но он слишком продвинутый для меня, и я продолжаю получать ошибки, я не знаю, какие биты заменить на что, извините:/ – user1762299

ответ

6

Возможно, можно использовать stat_boxplot для вычисления концов усов, но мне не хватает мастера ggplot2, поэтому я использую базовую функцию для этого.

set.seed(42) 
df <- data.frame(cond = factor(rep(c("A","B"), each=500)), 
       value = c(rnorm(500,mean=1,sd=0.2),rnorm(500, mean=1.5,sd=0.1))) 


whisk <- function(df,cond_col=1,val_col=2) { 
    require(reshape2) 
    condname <- names(df)[cond_col] 
    names(df)[cond_col] <- "cond" 
    names(df)[val_col] <- "value" 
    b <- boxplot(value~cond,data=df,plot=FALSE) 
    df2 <- cbind(as.data.frame(b$stats),c("min","lq","m","uq","max")) 
    names(df2) <- c(levels(df$cond),"pos") 
    df2 <- melt(df2,id="pos",variable.name="cond") 
    df2 <- dcast(df2,cond~pos) 
    names(df2)[1] <- condname 
    df2 
} 



library(ggplot2) 

plot1 <- ggplot(df, aes(x=cond)) 
plot1 <- plot1 + geom_errorbar(aes(ymin=min,ymax=max),data=whisk(df),width = 0.5) 
plot1 <- plot1 + geom_boxplot(aes(y=value)) 
plot1 

boxplot with horizontal at whisker ends

45

Как намекнул, но не выполняется @Roland, вы можете использовать stat_boxplot осуществить это. Трюк, вызывающий _boxplot два раза и должен установить geom на errorbar для одного из вызовов.

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

Использование @ фиктивных данных Роланда df

ggplot(df, aes(x=cond, y = value)) + 
stat_boxplot(geom ='errorbar') + 
geom_boxplot() # shorthand for stat_boxplot(geom='boxplot') 

enter image description here

помощь для stat_boxplot (?stat_boxplot) подробно различные значения, вычисленные и сохраненные в data.frame

+0

Спасибо, что нашли время, чтобы объяснить это! :) – gaelgarcia

+1

Как изменить размер этих строк вискеров, если я использую 'geom_boxplot (width = .2)'? – Produnis

+3

@ Produnis Чтобы изменить размер линий нитевидных кристаллов, добавьте аргумент 'stat_params = list (width = 0.5)' внутри функции: 'stat_boxplot'. Посмотрите результат в моем ответе. – mpalanco

14

Чтобы изменить размер усов линий, которые мы можем используйте аргумент width = 0.5 в функции: stat_boxplot

set.seed(42) 
df <- data.frame(cond = factor(rep(c("A", "B"), each = 500)), 
       value = c(rnorm(500, mean = 1, sd = 0.2), 
          rnorm(500, mean = 1.5, sd = 0.1))) 

library(ggplot2) 
ggplot(df, aes(x = cond, y = value)) + 
     stat_boxplot(geom = "errorbar", width = 0.5) + 
     geom_boxplot() 

enter image description here

+0

Это не работает для меня; Я получаю 'Ошибка: Неизвестные параметры: stat_params'. Какую версию R вы используете? – Will

+0

@ Могу ли я изменить ответ. Новая версия ggplo2 2.0.0 не принимает этот аргумент 'stat_params'. Теперь это должно сработать. – mpalanco

+0

Отлично, это сработало! Благодаря! – Will

Смежные вопросы