Вы можете использовать stat_summary
, чтобы применить функцию агрегирования к каждой группе значений y и передать результат в geom. Есть предостережение: боксплоты уже сгруппированы (каждый бокс представляет собой группу), поэтому, чтобы получить геом для пересечения боксплотов, вам нужно будет установить группировку по-разному между geom_boxplot
и stat_summary
. Думайте о эстетике группы как об определении того, что должно быть связано или разделено.
См. ?stat_summary
для получения полной информации о том, как вы можете указать функцию агрегирования, но tl; dr в том, что она может принимать независимые функции для y, ymin и ymax, или функцию с именем fun.data
, которая возвращает фрейм данных со столбцами с именами y
, ymin
и ymax
. Аргументы могут также передаваться через fun.args
, если вы не хотите писать анонимные функции. Если геому не нужны все три вида эстетики, вы можете просто указать одну (например, линиям просто нужно y
).
Итак, чтобы построить линии в первом, втором и третьем квартилях, добавив немного уклонения, чтобы все выровнялось,
library(ggplot2)
data('mpg', package = 'ggplot2')
mpg$cyl <- factor(mpg$cyl)
# note grouping here is set to what stat_summary needs (so we don't have to override so many times)
ggplot(mpg, aes(class, hwy, color = cyl, group = cyl)) +
geom_boxplot(aes(group = NULL)) + # override grouping here back to the default
stat_summary(geom = 'line', fun.y = median, position = position_dodge(0.75)) +
stat_summary(geom = 'line', fun.y = quantile, fun.args = list(probs = 0.25), position = position_dodge(0.75)) +
stat_summary(geom = 'line', fun.y = quantile, fun.args = list(probs = 0.75), position = position_dodge(0.75))
Хотя этот сюжет довольно занят. Другим параллельным пересечением координат / прямоугольника может быть использование geom_ribbon
(которое принимает ymin и ymax) для первого и третьего квантилей:
ggplot(mpg, aes(class, hwy, color = cyl, fill = cyl, group = cyl)) +
geom_boxplot(aes(group = NULL, fill = NULL)) +
stat_summary(geom = 'line', fun.y = median, position = position_dodge(0.75)) +
stat_summary(geom = 'ribbon', alpha = 0.3, position = position_dodge(0.75),
fun.data = function(x) {
data.frame(ymin = quantile(x, 0.25),
ymax = quantile(x, 0.75))
})