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]()
Ответы
Ответ 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 с цветным заполнением, черными границами и срединной линией