R ggplot2 geom_smooth без добавления отрицательных значений - PullRequest
1 голос
/ 22 февраля 2020

Предположим, что мы бежали install.packages("ggplot2") install.packages("babynames")

Тогда

library(babynames)
data(babynames)
my_d <- babynames %>%
  filter(
    name == "Josiah"   & sex == "M" |
      name == "Alicia"  & sex == "F" |
      name == "Gabriel"  & sex == "M" |
      name == "Joshua" & sex == "M"
  ) %>%
  group_by(name, year, sex) %>%
  summarise(n = sum(n) ) %>%
  arrange(year)

ggplot(my_d, aes(x = year, y = n, color = name) ) +
  geom_line(se = FALSE) +
  scale_x_continuous(breaks = seq(1900, 2020, by = 10) )

дает

enter image description here

Это хорошо, но я хотел бы сгладить его "немного", поэтому я делаю

ggplot(my_d, aes(x = year, y = n, color = name) ) +
  geom_smooth(se = FALSE) +
  scale_x_continuous(breaks = seq(1900, 2020, by = 10) )

, что дает enter image description here

Это гладко, но он добавил отрицательные значения для «Джошуа».

Как можно избежать этого «побочного эффекта»?

РЕДАКТИРОВАТЬ: Изменение

geom_smooth(se = FALSE)

на

geom_smooth(se = FALSE, method = "loess") +
  ylim(0, 30000)

удаляет отрицательные значения, но «сглаживание все еще является грубым, так сказать». Оно показывает «Габриэля» с возрастающим трендом, а это не так. Вот результат

enter image description here

1 Ответ

2 голосов
/ 22 февраля 2020

Аргумент span = должен сделать сглаживание "вигглером" в соответствии с документацией . Возможно, игра с этим решит вашу проблему. Ниже приведен пример с span = .1. Шероховатые края исчезли с линий, но общие тенденции, как правило, остаются видимыми и правдивыми. Установка слишком низкого значения span может вызвать проблемы с памятью в зависимости от размера данных.

library(babynames)
library(tidyverse)
data(babynames)
my_d <- babynames %>%
  filter(
    name == "Josiah"   & sex == "M" |
      name == "Alicia"  & sex == "F" |
      name == "Gabriel"  & sex == "M" |
      name == "Joshua" & sex == "M"
  ) %>%
  group_by(name, year, sex) %>%
  summarise( n = sum(n) ) %>%
  arrange( year )

ggplot( my_d, aes(x = year, y = n, color = name) ) +
  geom_smooth(se = FALSE, method = "loess", span = .1) +
  scale_x_continuous( breaks = seq(1900, 2020, by = 10) )

Создано в 2020-02-21 с помощью представьте пакет (v0.3.0)

...