Подтвердить что ты не робот

Boxplot, как совместить цвета outliers, чтобы заполнить эстетику?

Я пытаюсь сопоставить цвет ящиков boxplot с цветом заливки, который задается с помощью эстетического (scale_colour_discrete).

Вот пример.

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    fill=factor(Animation)))
m + geom_boxplot() + scale_y_log10()

Это создает график ниже. Как изменить эти черные точки на красноватые/зеленоватые цвета, используемые в теле? outlier.colour вариант boxplot, кажется, выбирает один цвет поперек, а не как эстетический, если я правильно понимаю. Я не против использования цветовой эстетики, если это помогает.

Original Version


Edit:

Адаптировано это решение (изменение определения вискера в geom_boxplot). Горизонтальное уклонение reset от stats_summary, и я не мог понять, как его вернуть. Я мог бы пренебречь выбросами и растянуть бакенбарды по мере необходимости, так как знаю, как сейчас.

# define the summary function
f <- function(x) {
  r <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  r
}
# define outlier function, beyound 5 and 95% percentiles
o <- function(x) {
  subset(x, x < quantile(x,probs=c(0.05))[1] | quantile(x,probs=c(0.95))[1] < x)
}

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    colour=factor(Animation)))
m <- m + stat_summary(fun.data=f, geom='boxplot')
m <- m + stat_summary(fun.y=o, geom='point', aes(colour=factor(Animation)))
m + scale_y_log10()

Failed attempt

4b9b3361

Ответ 1

Как сказал @koshke, теперь, когда выбросы, окрашенные как строки окна (а не цвет заливки), теперь легко можно установить, установив outlier.colour = NULL:

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    colour = factor(Animation)))
m + geom_boxplot(outlier.colour = NULL) + scale_y_log10()

boxplot with coloured outliers

  • outlier.colour должен быть записан с помощью "ou"
  • outlier.colour должен находиться вне aes ()

Я публикую это как поздний ответ, потому что я снова и снова нахожусь в этом вопросе, и я также разместил его для связанного с ним вопроса Окрашивание ячеек памяти в ggplot2?.

Ответ 2

Я нашел решение, что установка geom_boxplot(outlier.colour = NULL) больше не работает в новейших версиях R (@jonsnow говорит о версии 1.0.0 ggplot2).

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

update_geom_defaults("point", list(colour = NULL))
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
            colour = factor(Animation)))
m + geom_boxplot() + scale_y_log10()

как и ожидалось, это создает график с точками, соответствующими цвету линии.

Конечно, нужно помнить о восстановлении по умолчанию, если ему нужно нарисовать несколько графиков:

update_geom_defaults("point", list(colour = "black"))

Решение было найдено, прочитав html =

Выбросы geom_boxplot() используют цвет, размер и форму по умолчанию. geom_point(). Изменение значений по умолчанию geom_point() с update_geom_defaults() применит те же изменения к выбросам geom_boxplot(). Изменение значений по умолчанию для выбросов было ранее не возможное. (@ThierryO, # 757)

Отправлено также: Окрашивание точек выброса boxplot в ggplot2?

Ответ 3

Я нашел способ сделать это, отредактировав исходный объект grid.

library(ggplot2)

match.ol.col <- function(plt,aes.cp='fill') {
  # matches outliers' color to either fill or colour aesthetics
  #   plt: ggplot layer object having boxplot
  #   aes.cp: aetsthetic from which copy color.  must be either 'fill' or 'col'
  # returns grid objects, so print it wigh grid.draw(), not print()
  if (aes.cp %in% c('color', 'colour')) aes.cp <- 'col'
  grob <- ggplotGrob(plt)
  bps <- getGrob(grob, 'boxplots', grep=T)
  for (bp in bps$children) {
    p <- getGrob(bp, 'point', grep=T)
    if (is.null(p)) next
    r <- getGrob(bp, 'rect', grep=T)
    grob <- geditGrob(grob, p$name, gp=gpar(col=r$gp[[aes.cp]]))
  }
  return(grob)
}


m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
    colour=factor(Animation)))
p <- m + geom_boxplot() + scale_y_log10()

grob <- match.ol.col(p, aes.cp='colour')
grid.draw(grob)

результаты:

demobox.png

Ответ 4

У меня была очень похожая проблема. Я хотел совместить стиль с предыдущим сюжетом, поэтому хотел, чтобы черные границы с цветным заполнением и соответствующие выбросы.

Мое решение состояло в том, чтобы перепечатать один раз с цветом = и по умолчанию сплошной точкой круга, а один раз с fill = и открытой круглой формой

p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot(aes(colour=factor(cyl))) + 
    geom_boxplot(aes(fill=factor(cyl)), outlier.shape=21)

boxplot с цветным заполнением, черными границами и срединной линией