Какая область затенения под гистограммой ggridges (stat = binline)?

Использование предложения доктора Эверса для затенения областей под кривой плотности с ggridges работает хорошо. Однако я считаю, что кривые плотности могут вводить в заблуждение, поскольку подразумевают, что данные есть, а их нет. Поэтому я решил попробовать эту технику затенения с обычной гистограммой.

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

library(tidyverse)
install.packages("ggridges", dependencies=TRUE)  # there are many
library(ggridges)
 t2 <-   structure(list(Date = c("1853-01", "1853-02", "1853-03", "1853-04", 
"1853-05", "1853-06", "1853-07", "1853-08", "1853-09", "1853-10", 
"1853-11", "1853-12", "1854-01", "1854-02", "1854-03", "1854-04", 
"1854-05", "1854-06", "1854-07", "1854-08", "1854-09", "1854-10", 
"1854-11", "1854-12"), t = c(-5.6, -5.3, -1.5, 4.9, 9.8, 17.9, 
18.5, 19.9, 14.8, 6.2, 3.1, -4.3, -5.9, -7, -1.3, 4.1, 10, 16.8, 
22, 20, 16.1, 10.1, 1.8, -5.6), year = c("1853", "1853", "1853", 
"1853", "1853", "1853", "1853", "1853", "1853", "1853", "1853", 
"1853", "1854", "1854", "1854", "1854", "1854", "1854", "1854", 
"1854", "1854", "1854", "1854", "1854")), row.names = c(NA, -24L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("Date", 
"t", "year"))


gg <- ggplot(t2, aes(x = t, y = year)) +
      geom_density_ridges(stat = "binline", bins = 10, scale = 0.8, 
                      draw_baseline = TRUE) +
      theme_ridges()

# Build ggplot and extract data
d <- ggplot_build(gg)$data[[1]]

# Add geom_ribbon for shaded area
gg +
  geom_ribbon(
    data = transform(subset(d, x >= 10), year = group),
    aes(x, ymin = ymin, ymax = ymax, group = group),
    fill = "red",
    alpha = 1.0) 

введите описание изображения здесь


person ixodid    schedule 24.04.2018    source источник


Ответы (2)


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

ggplot(t2, aes(x = t, y = year, fill = ifelse(..x..>=10, ">= 10", "< 10"))) +
  geom_density_ridges_gradient(stat = "binline", binwidth = 3,
                               center = 8.5, scale = 0.8, 
                               draw_baseline = TRUE) +
  theme_ridges() +
  scale_fill_manual(values = c("gray70", "red"), name = NULL)

введите описание изображения здесь

Причина, по которой вы наблюдаете эффект, который вы делаете, заключается в том, что ось x изменяется между первым и вторым графиком, а диапазон оси x влияет на то, как отрисовываются интервалы. Есть два решения: вы можете либо исправить диапазон оси x, либо определить интервалы с помощью center и binwidth, а не bins. (На мой взгляд, второй вариант всегда предпочтительнее, независимо от того, как вы относитесь к оси x.)

Во-первых, исправьте диапазон оси x:

gg <- ggplot(t2, aes(x = t, y = year)) +
  geom_density_ridges(stat = "binline", bins = 10, scale = 0.8, 
                      draw_baseline = TRUE) +
  theme_ridges() +
  scale_x_continuous(limits = c(-12, 28)) # this is where the change is

# Build ggplot and extract data
d <- ggplot_build(gg)$data[[1]]

# Add geom_ribbon for shaded area
gg +
  geom_ribbon(
    data = transform(subset(d, x >= 10), year = group),
    aes(x, ymin = ymin, ymax = ymax, group = group),
    fill = "red",
    alpha = 1.0) 

введите описание изображения здесь

Во-вторых, альтернативное определение корзины:

gg <- ggplot(t2, aes(x = t, y = year)) +
  geom_density_ridges(stat = "binline",
                      binwidth = 3, center = 8.5, # this is where the change is
                      scale = 0.8, draw_baseline = TRUE) +
  theme_ridges()

# Build ggplot and extract data
d <- ggplot_build(gg)$data[[1]]

# Add geom_ribbon for shaded area
gg +
  geom_ribbon(
    data = transform(subset(d, x >= 10), year = group),
    aes(x, ymin = ymin, ymax = ymax, group = group),
    fill = "red",
    alpha = 1.0) 

введите описание изображения здесь

person Claus Wilke    schedule 24.04.2018

Действительно происходит что-то странное. Пожалуйста, смотрите ниже "заключение".

  1. Если мы построим только gg:

     gg;
    

    введите описание изображения здесь

  2. Если мы построим gg плюс ступеньку, которая должна соответствовать следу gg:

      gg +
          geom_step(
              data = d, 
              aes(xmax, ymax, group = group), 
              direction = "vh", col = "red",  size = 2);
    

введите описание изображения здесь

Таким образом, добавление geom_step как-то меняет gg. Я не понимаю, как это могло быть. Вы можете видеть, что geom_step (красная кривая) действительно соответствует следу гистограммы при построении самого gg (см. Первый график).

person Maurits Evers    schedule 24.04.2018
comment
Я разместил эту проблему на странице github.com/clauswilke/ggridges и вернусь сюда, если / когда решено. - person ixodid; 24.04.2018
comment
Линия интервала изменяется, потому что пределы оси x изменяются между первым и вторым графиком, а гистограмма была указана только количеством интервалов, а не шириной интервала и местоположением. Либо исправление пределов оси x, либо решает проблему. - person Claus Wilke; 25.04.2018