Почему NA в середине geom_line не всегда ломает линию? - PullRequest
2 голосов
/ 04 марта 2020

Мой вопрос связан с этой проблемой:

Создать линейный график, используя категориальные данные и не соединяя линии

Вот пример из связанного вопроса:

library(ggplot2)
df <- data.frame(x = c('a', 'b', 'c', 'd', 'e'), 
                 y = c('a', 'a', NA, 'a', 'a'))

ggplot(df, aes(x = x, y = y, group = y)) +
  geom_point() + 
  geom_line()

Рисуется непрерывная линия, хотя df$y содержит NA:

is.na(df$y)
[1] FALSE FALSE  TRUE FALSE FALSE

Я запутался, потому что в справке для geom_line() под Отсутствует значение обрабатывая , он говорит, что:

geom_path (), geom_line () и geom_step обрабатывают NA следующим образом:

Если NA появляется в середине строки, он ломает черту. Предупреждение не отображается, независимо от того, является ли na.rm ИСТИНА или ЛОЖЬ.

Может кто-нибудь объяснить мне, почему это не работает для категориальных данных в примере выше?

Из-за попыток, я думаю, это как-то связано с частью group, но я действительно не понимаю, как это работает. Большое спасибо за вашу помощь!

Редактировать:
В отличие от того, что я предположил, на самом деле не имеет значения, являются ли данные категориальными или числовыми. См .:

ggplot(df, aes(x = as.numeric(as.factor(x)), y = as.numeric(as.factor(y)), group = as.numeric(as.factor(y)))) +
  geom_point() + 
  geom_line()

Это только удаляет NA точку , но продолжает рисовать линию на разрыве. Действительно, критической точкой является группировка, которая не требуется для числовых данных:

ggplot(df, aes(x = as.numeric(as.factor(x)), y = as.numeric(as.factor(y)))) +
  geom_point() + 
  geom_line() 

См. Комментарии ниже.

1 Ответ

1 голос
/ 04 марта 2020

Действительно интересно, что он работает по-разному для непрерывных и категориальных данных, но это имеет смысл, учитывая различную природу этих данных.

Чтобы обойти это без использования rle, можно разложить и использовать уровни факторов для построения графика. Затем вы можете изменить метку с помощью scale

Пользователь Edward прав в своем комментарии - группировка очень важна. Здесь я использовал group = 1

library(ggplot2)
df <- data.frame(x = c('a', 'b', 'c', 'd', 'e'), 
                 y = c('a', 'a', NA, 'a', 'a'))

ggplot(df, aes(x = x, y = as.numeric(as.factor(y)), group = 1)) +
  geom_point() + 
  geom_line() +
  scale_y_continuous(breaks = 1, labels = 'a')
#> Warning: Removed 1 rows containing missing values (geom_point).

Создано в 2020-03-04 пакетом Представить (v0.3.0)

...