r - 从 ggplot2 中删除零线
问题描述
我试图避免在第一个和最后一个零之外绘制线条以避免这种重叠。请注意,这只是一个更大数据集的玩具数据,过滤 0 的解决方案在这种情况下不起作用。
dta <-
data.frame(grp = c(rep("a",10), rep("b",10),rep("c",10)),
lines = c(rep(seq(1,10,1),3)),
vc = c(c(0,0,0,0,.3,.3,.1, 0,0,0),
c(.1,.3,.3,.3,.1, 0,0,0,0,0),
c(0,0,0,0,0, 0,0,0,0,0)))
dta %>%
ggplot(aes(lines, vc, color = grp))+
geom_line()+
scale_x_continuous(
breaks = seq(0, 10, 1)
)+
scale_y_continuous(
limits = c(-0.01, 1),
breaks = seq(0, 1, 0.1)
)
请问有关于如何删除这些行的任何想法吗?例如,蓝线应在 x=6 处停止。
如果我将 0 设置为NA
行,则不要向下移动到 x 轴。
dta %>%
mutate(vc = ifelse(vc==0, NA, vc)) %>%
ggplot(aes(lines, vc, color = grp))+
geom_line()+
scale_x_continuous(
breaks = seq(0, 10, 1)
) +
scale_y_continuous(
limits = c(-0.01, 1),
breaks = seq(0, 1, 0.1)
)
解决方案
这个解决方案有点冗长,但我相信你需要的。它可以应用于分组数据框。对于每个组,给定一个列名作为输入,它会在开头和结尾处剪掉该列等于零的行……但重要的是,它在开头和结尾处保留零。
函数定义
该函数使用 tidy 评估列名称来修剪数据框。带有 find 的语句which
在开头和结尾运行零(如果存在),并保留非零条目之前的最后一个零和它们之后的第一个零。
trim_zero <- function(data, column) {
x0 <- pull(data, {{ column }}) == 0
beginning_0 <- max(which(x0)[which(x0) < min(which(!x0))], 1)
ending_0 <- min(which(x0)[which(x0) > max(which(!x0))], length(x0))
data[beginning_0:ending_0, ]
}
将函数应用于您的数据
require(dplyr)
require(ggplot2)
dta_trimmed <- dta %>%
group_by(grp) %>%
group_modify(~ trim_zero(., vc))
ggplot(dta_trimmed, aes(lines, vc, color = grp))+
geom_line()+
scale_x_continuous(
breaks = seq(0, 10, 1)
)+
scale_y_continuous(
limits = c(-0.01, 1),
breaks = seq(0, 1, 0.1)
)
推荐阅读
- firebase - 如何在移动设备上使用浏览器打开 Firebase pdf?
- java - 转换 HttpServletRequest.getParameterMap() [Map
] 到地图 > 使用 Java 流 - javascript - Jquery 名称 '' is 在当前上下文中不存在
- r - 选择“机器”列匹配的数据表行和不同数据表中的“每周销售额”>“每周销售额”
- sql - 如果未设置 WHERE 子句,则忽略 MS ACCESS 查询中的列
- javascript - 我无法运行输入数字的最小值和最大值
- indexing - (Cosmos DB) 复合索引中的系统函数是范围过滤器吗?
- angular - 那里有在 Angular 较新版本上添加交互式 D3 js v6 图表的任何实用指南
- sql - ORDER BY 的意外结果
- redis - Redis 集群裂脑场景