Остановить geom_density_ridges от показа несуществующих значений хвоста

Когда я использую geom_density_ridges, график часто показывает длинные хвосты значений, которых нет в данных.

Вот пример:

library(tidyverse)
library(ggridges)

data("lincoln_weather")

# Remove all negative values for "Minimum Temperature"
d <- lincoln_weather[lincoln_weather$`Min Temperature [F]`>=0,]

ggplot(d, aes(`Min Temperature [F]`, Month)) +
  geom_density_ridges(rel_min_height=.01)

geom_ridgline Как вы можете видеть, январь, февраль и декабрь показывают отрицательные температуры, но в данных вообще нет отрицательных значений.

Конечно, я могу добавить ограничения на ось X, но это не решает проблему, потому что она просто усекает существующую ошибочную плотность.

ggplot(d, aes(`Min Temperature [F]`, Month)) +
  geom_density_ridges(rel_min_height=.01) +
  xlim(0,80)

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

Как я могу это исправить?

2 ответа

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

# Remove all negative values for "Minimum Temperature"
d <- lincoln_weather[lincoln_weather$`Min Temperature [F]`>=0,]

ggplot(d, aes(`Min Temperature [F]`, Month, group = Month, height = ..density..)) +
  geom_density_ridges(stat = "density", trim = TRUE)

В качестве альтернативы, вы можете нарисовать точечный коврик, может быть, это также подходит вам или лучше:

ggplot(d, aes(`Min Temperature [F]`, Month)) +
  geom_density_ridges(rel_min_height = 0.01, jittered_points = TRUE,
                      position = position_points_jitter(width = 0.5, height = 0),
                      point_shape = "|", point_size = 2,
                      alpha = 0.7)

Примечание: эти два подхода в настоящее время не могут быть объединены, что потребует внесения некоторых изменений в код статистики.

Что ж, получается, что я должен был просто прочитать документацию более внимательно. Ключевая часть:

"Пакет ggridges предоставляет два основных geom, geom_ridgeline и geom_density_ridges. Первый принимает значения высоты непосредственно для рисования линий ребер, а второй сначала оценивает плотности данных, а затем рисует те, которые используют линии гребней".

Есть несколько способов справиться с этой проблемой. Вот один из них:

ggplot(d, aes(`Min Temperature [F]`, Month, height=..density..)) +
  geom_density_ridges(stat = "binline", binwidth=1,
                      draw_baseline = F)

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

Другие вопросы по тегам