Остановить 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)
Как вы можете видеть, январь, февраль и декабрь показывают отрицательные температуры, но в данных вообще нет отрицательных значений.
Конечно, я могу добавить ограничения на ось X, но это не решает проблему, потому что она просто усекает существующую ошибочную плотность.
ggplot(d, aes(`Min Temperature [F]`, Month)) +
geom_density_ridges(rel_min_height=.01) +
xlim(0,80)
Теперь на графике видно, что значения января и февраля равны нулю (их нет). Это также выглядит так, будто 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)