Объясните предупреждение ggplot2: «Удалено k строк, содержащих пропущенные значения»

89

Я получаю это предупреждение, когда пытаюсь создать график с помощью ggplot.

После некоторого исследования в Интернете многие предположили, что моя база данных содержит либо нулевые значения, либо отсутствующие данные в целом, что было не так.

На этот вопрос принятый ответ гласит следующее:

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

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

ksm001
источник
5
В yэтом вопросе есть предел оси. Значения ограничены между 0 и 0,12 из-за этой функции:ylim(0,0.12)
LyzandeR
1
Воспроизводимый пример поможет ответить на этот вопрос. @LyzandeR, похоже, идет правильным путем.
vpipkt

Ответы:

85

Поведение, которое вы видите, связано с тем, как ggplot2обрабатываются данные, выходящие за пределы диапазонов осей графика. Вы можете изменить это поведение в зависимости от того, используете ли вы scale_y_continuous(или, что то же самое, ylim) или coord_cartesianустанавливаете диапазоны осей, как описано ниже.

library(ggplot2)

# All points are visible in the plot
ggplot(mtcars, aes(mpg, hp)) + 
  geom_point()

В приведенном ниже коде одна точка с hp = 335 находится за пределами y-диапазона графика. Кроме того, поскольку мы использовали scale_y_continuousдля установки диапазона оси Y, эта точка не включается ни в какую другую статистику или сводные показатели, рассчитываемые с помощью ggplot, такие как линия линейной регрессии.

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(0,300)) +  # Change this to limits=c(0,335) and the warning disappars
  geom_smooth(method="lm")

Warning messages:
1: Removed 1 rows containing missing values (stat_smooth). 
2: Removed 1 rows containing missing values (geom_point).

В приведенном ниже коде точка с hp = 335 все еще находится за пределами y-диапазона графика, но эта точка, тем не менее, включается в любые статистические или сводные показатели, которые вычисляет ggplot, например линия линейной регрессии. Это связано с тем, что мы использовали coord_cartesianдля установки диапазона оси Y, и эта функция не исключает точки, которые находятся за пределами диапазонов графика, когда она выполняет другие вычисления с данными.

Если вы сравните этот и предыдущий график, вы увидите, что линия линейной регрессии на втором графике имеет немного более крутой наклон, потому что точка с hp = 335 включена при вычислении линии регрессии, даже если она не видна на графике. .

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm")
eipi10
источник
11

Просто для встряски, завершающей ответ, данный eipi10.

Я столкнулся с той же проблемой, не используя scale_y_continuousни coord_cartesian.

Конфликт исходил от оси x, которую я определил limits = c(1, 30). Кажется, что такие ограничения не предоставляют достаточно места, если вы хотите «увернуться» от ваших полос, поэтому R все равно выдает ошибку

Удалено 8 строк с пропущенными значениями (geom_bar)

Регулировка пределов оси x для limits = c(0, 31)решения проблемы.

В заключение, даже если вы не ограничиваете свою ось y, проверьте поведение оси x, чтобы убедиться, что у вас достаточно места.

Давиднортес
источник
Это так часто упускают. Тот же человек. Снова через некоторое время ... вздох Спасибо!
Геном
1

Даже если ваши данные попадают в указанные вами пределы (например c(0, 335)), добавление geom_jitter()оператора может вывести некоторые точки за эти пределы, что приведет к тому же сообщению об ошибке.

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# No jitter -- no error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    scale_y_continuous(limits=c(0,335))


# Jitter is too large -- this generates the error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    geom_jitter(position = position_jitter(w = 0.2, h = 0.2)) +
    scale_y_continuous(limits=c(0,335))
#> Warning: Removed 1 rows containing missing values (geom_point).

Создано 24.08.2020 с помощью пакета REPEX (v0.3.0)

Тодд
источник
0

Я тоже столкнулся с этим, но в том случае, когда я хотел избежать дополнительных сообщений об ошибках, сохраняя указанный диапазон. Также можно задать подмножество данных перед установкой диапазона, чтобы диапазон можно было сохранить, как вам нравится, без появления предупреждений.

library(ggplot2)

range(mtcars$hp)
#> [1]  52 335

# Setting limits with scale_y_continous (or ylim) and subsetting accordingly
## avoid warning messages about removing data
ggplot(data= subset(mtcars, hp<=300 & hp >= 100), aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(100,300))
Роб
источник