Отображение stat_summary в каждой группе эстетическим отображением в ggplot - PullRequest
0 голосов
/ 01 июля 2018

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

Желаемый результат - график рассеяния со средней линией для каждого года, в пределах для каждой категории. Например, на графике ниже я бы хотел срединную линию для значений в 1999, 2000 и 2001 годах в категории A (то есть, 3 строки по цвету), а затем такую ​​же в категории B (итого 6 средних линий).

Я посмотрел здесь , но это, похоже, не дало того, чего я хотел, так как он использовал фасеты.

Мой график выглядит так, как будто он рисует линию между медианами каждой категории. Может ли stat_summary просто нарисовать срединную линию в каждой категории, или мне нужно использовать другой подход (например, вычисление медиан и добавление каждой линии к графику по категории?

enter image description here

Воспроизводимый простой пример

library(tidyverse)
library(lubridate)

# Sample data
Date     <- sort(sample(seq(as.Date("1999-01-01"), as.Date("2002-01-01"), by = "day"), 500))
Category <- rep(c("A", "B"), 250)
Value    <- sample(100:500, 500, replace = TRUE)

# Create data frame
mydata   <- data.frame(Date, Category, Value)

# Plot by category and color by year
p <- ggplot(mydata, aes(x = Category, y = Value,
                        color = factor(year(Date))
                        )
            ) + 
  geom_jitter() 
p


# Now add median values of each year for each group
p <- p +
  stat_summary(fun.y = median,
               geom  = "line",
               aes(color = factor(year(Date))),
               group = 1,
               size = 2
               )
p

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вот еще одна возможность использования geom_errorbar (вместо stat_summary)

# Sample data
set.seed(2017);
Date     <- sort(sample(seq(as.Date("1999-01-01"), as.Date("2002-01-01"), by = "day"), 500))
Category <- rep(c("A", "B"), 250)
Value    <- sample(100:500, 500, replace = TRUE)
mydata   <- data.frame(Date, Category, Value)

mydata %>%
    mutate(colour = factor(year(Date))) %>%
    group_by(Category, year(Date)) %>%
    mutate(Median = median(Value)) %>%
    ggplot(aes(Category, Value, colour = colour)) +
    geom_jitter() +
    geom_errorbar(
        aes(ymin = Median, ymax = Median))

enter image description here

Объяснение: Мы предварительно вычисляем срединные значения для Category на year(Date) и рисуем срединные линии, используя geom_errorbar.


Обновление

В ответ на ваш комментарий, если вы хотите использовать summarise для предварительного вычисления значений медианы, вы можете сохранить значения медианы в отдельном data.frame

df <- mydata %>%
    mutate(Year = as.factor(year(Date))) %>%
    group_by(Category, Year) %>%
    summarise(Median = median(Value))

ggplot(mydata, aes(Category, Value, colour = factor(year(Date)))) +
    geom_jitter() +
    geom_errorbar(
        data = df,
        aes(x = Category, y = Median, colour = Year, ymin = Median, ymax = Median))

Это не так чисто, как в первом решении (так как вам нужно указать всю эстетику в geom_errorbar), но получающийся сюжет такой же.

0 голосов
/ 02 июля 2018

То, что вы ищете, на самом деле является точкой, даже если она выглядит как линия, потому что вы не хотите связывать наблюдения (что делает линия), вы просто хотите показать дискретное значение (что за точка делает).

Один из способов, очень похожих на сообщение, на которое вы ссылаетесь, - это сделать stat_summary и использовать фигуру, которая по сути является большой чертой. Я уменьшил альфу и размер дрожащих точек, чтобы лучше отличать их от медиан. Для медиан я сохранил цветовое назначение на прежнем уровне, но установил для группы взаимодействие между годом и категорией, поэтому было рассчитано шесть различных медиан.

Обратите внимание, что я установил начальное число для генерации случайных чисел и изменил конечную дату на 31.12.2001 вместо 01.01.2002, так как вы сказали, что ожидали 3 года, но в течение одного поколения я получил несколько наблюдений 1 /1/2002.

library(tidyverse)
library(lubridate)

set.seed(987)
Date     <- sort(sample(seq(as.Date("1999-01-01"), as.Date("2001-12-31"), by = "day"), 500))
Category <- rep(c("A", "B"), 250)
Value    <- sample(100:500, 500, replace = TRUE)

# Create data frame
mydata   <- data.frame(Date, Category, Value)

mydata <- mydata %>%
  mutate(year = year(Date) %>% as.factor())

ggplot(mydata, aes(x = Category, y = Value, color = year)) +
  geom_jitter(size = 0.6, alpha = 0.6) +
  stat_summary(fun.y = median, 
               geom = "point",
               aes(group = interaction(Category, year)),
               shape = 95, size = 12, show.legend = F)

Создан в 2018-07-01 пакетом Представ (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...