Положите концы усов на коробку

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


person user1762299    schedule 20.10.2012    source источник
comment
вы можете сделать это, вычислив квантиль, в котором ggplot рисует линии, и нарисовав свои собственные geom_segment или geom_crossbar. см. этот вопрос   -  person Justin    schedule 21.10.2012
comment
Есть ли причина, по которой это нужно делать в ggplot2, а не использовать boxplot, который уже делает то, что вы хотите, или этот вопрос представляет чисто академический интерес ...?   -  person Jake Westfall    schedule 21.10.2012
comment
@Justin Спасибо, я проверил этот вопрос, но он слишком сложен для меня, и я продолжаю получать ошибки, я не знаю, какие биты чем заменить, извините: /   -  person user1762299    schedule 21.10.2012
comment
@Jake Это чисто эстетично! У меня есть задание, требующее 2 графиков, один блок-график, один график взаимодействия. Я создал график взаимодействия в ggplot2 и хотел бы, чтобы диаграмма была согласованной (с метками осей близко к меткам галочки) ....   -  person user1762299    schedule 21.10.2012
comment
@Jake @ Justin В качестве альтернативы, есть ли способ переместить положение меток осей на базовой диаграмме так, чтобы они были ближе к меткам галочки и были выделены жирным шрифтом? Я уверен, что веду себя слишком разборчиво, но хотелось бы, чтобы графики были последовательными.   -  person user1762299    schedule 21.10.2012
comment
@Jake @ Justin Может быть, я бы не потерял оценки за коробчатую диаграмму ggplot2, не имеющую концов на усах, но я просто думаю, что концы на усах - это более традиционный коробчатая диаграмма, и легче понять, каковы суммы с концами на них. Спасибо за ответ :)   -  person user1762299    schedule 21.10.2012


Ответы (3)


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

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

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

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

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

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

person mnel    schedule 21.10.2012
comment
Спасибо, что нашли время объяснить это! :) - person gaelgarcia; 18.02.2015
comment
как я могу изменить размер этих усов, если я использую geom_boxplot(width=.2)? - person Produnis; 04.06.2015
comment
@ Produnis Чтобы изменить размер линий усов, добавьте аргумент stat_params = list(width = 0.5) внутри функции: stat_boxplot. Результат смотрите в моем ответе. - person mpalanco; 07.07.2015
comment
@Produnis и другие. В настоящее время: geom_boxplot(width = 0.2) + stat_boxplot(geom = "errorbar", width = 0.2), где значения, выбранные на прямоугольной диаграмме и в полосах погрешностей, должны совпадать. Для усов, которые занимают половину поля, вы должны установить width = 0.2 и width = 0.1. - person PatrickT; 05.12.2018

Чтобы изменить размер линий усов, мы можем использовать аргумент 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() 

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

person mpalanco    schedule 07.07.2015
comment
Похоже, у меня это не работает; Я получаю Error: Unknown parameters: stat_params. Какую версию R вы используете? - person Will; 14.01.2016
comment
@ Я изменил ответ. Новая версия ggplo2 2.0.0 не принимает этот аргумент stat_params. Теперь должно работать. - person mpalanco; 16.01.2016
comment
Однако следует отметить, что это решение помещает полосы ошибок в верхнюю часть окна, что немного странно; есть ли способ, чтобы вертикальная полоса не запускалась поверх коробки? - person Will; 16.01.2016
comment
Потрясающие! Теперь это очевидно, когда я думаю об этом. Спасибо! - person Will; 18.01.2016
comment
Я пробовал использовать этот красивый код в сочетании с оператором fill для раскраски подгрупп. Он работает без настройки ширины, но с настройкой ширины, к сожалению, приводит к странным эффектам. - person Insa; 23.05.2016
comment
Чтобы избежать появления полос ошибок в верхней части окна, я сделал stat_boxplot(geom = 'errorbar') + geom_boxplot(inherit.aes = TRUE) - person Fábio; 14.01.2018
comment
@Facottons Я не понимаю твоей точки зрения. Аргумент по умолчанию для inherit.aes - ИСТИНА, поэтому geom_boxplot(inherit.aes = TRUE) и geom_boxplot() идентичны. - person mpalanco; 14.01.2018

Можно было бы использовать 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

коробчатая диаграмма с горизонтальным расположением на концах усов

person Roland    schedule 21.10.2012