首页 > 解决方案 > 为什么 geom_line 中间的 NA 并不总是断线?

问题描述

我的问题与这个问题有关:

使用分类数据而不是连接线创建线图

以下是链接问题的示例:

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 是 TRUE 还是 FALSE,都不会显示警告。

谁能向我解释为什么这不适用于上面示例中的分类数据?

通过尝试,我猜这与该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() 

请参阅下面的评论。

标签: rggplot2plotna

解决方案


确实有趣的是,它对连续数据和分类数据的工作方式不同,但考虑到这些数据的不同性质,这有点道理。

一种绕过它的方法,不使用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).

reprex 包(v0.3.0)于 2020 年 3 月 4 日创建


推荐阅读