добавить строки для верхней / нижней связи, медиана в ggplot boxplot - PullRequest
1 голос
/ 04 июля 2019

У меня есть блокпост:

enter image description here

Что на самом деле трудно сказать, какая группа имеет более высокие значения.

Как добавить линии на диаграмме, которые соединяют Q1, Q2, Q3 для каждой группы соответственно?

1 Ответ

1 голос
/ 04 июля 2019

Вы можете использовать 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)) 

boxplots with lines

Хотя этот сюжет довольно занят. Другим параллельным пересечением координат / прямоугольника может быть использование 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))
                 })

boxplots with line and ribbon

...