首页 > 解决方案 > 从 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)
  )

在此处输入图像描述 我需要蓝线向下到 x 轴然后停止。这适用于所有其他线路。

标签: rggplot2

解决方案


这个解决方案有点冗长,但我相信你需要的。它可以应用于分组数据框。对于每个组,给定一个列名作为输入,它会在开头和结尾处剪掉该列等于零的行……但重要的是,它在开头和结尾处保留零。

函数定义

该函数使用 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)
  ) 

在此处输入图像描述


推荐阅读