r - 为什么 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()
请参阅下面的评论。
解决方案
确实有趣的是,它对连续数据和分类数据的工作方式不同,但考虑到这些数据的不同性质,这有点道理。
一种绕过它的方法,不使用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 日创建
推荐阅读
- azure - 跟踪脚本和 Azure CDN
- jdbc - 在 JDBC 代码中为 DB2 添加 SSL 服务器证书
- swift - Rxswift 在发送 api 请求之前验证输入
- google-apps-script - 为什么使用时从我的 Google 表格中提取的日期会提前 1 天?
- python - 从python中的视频中获取特定的帧序列
- html - 有没有办法使用 Node.js 路由覆盖 Angular 路由器 - 仅针对特定路径?
- dart - SocketException:主机查找失败:'..co'(操作系统错误:提供节点名或服务名,或未知,errno = 8)
- python - 数据框列是一个包含国家/地区的字符串,我想用该国家/地区创建一个新列
- python-3.x - 对于导致错误“迭代器已启动”的循环,
' - powershell - 如何使用powershell在word中创建书签