如果有时某个子集故意为空,如何在ggplot中添加第二个geom_point?

时间:2018-12-05 00:11:19

标签: r ggplot2

我有很好的这段代码。基本上,它所做的是遍历该状态的所有状态和该房间,以绘制每个状态的图。

lapply(unique(finaldat$st), function(s){
  chambs <- unique(finaldat$chamber[finaldat$st == s])
  p <- list(NULL)
  for(c in 1:length(chambs)){
    p[[c]] <- finaldat %>% filter(st == s & chamber == chambs[c]) %>%

      ggplot(aes(x = average, y = score, col = color))+
      geom_point(aes(size= Total,alpha = 0.5)) +
      stat_smooth(method = "lm") + 
      geom_point(data=subset(finaldat,st==s & chamber == chambs[c] & highlight>0),aes(col="yellow")) +
      ggtitle(paste(s,chambs[c],year)) + 
      scale_size(range = c(.5,3.5)) + 
      scale_color_manual(labels = c("1","2","3"), 
                         values = c("blue","red","yellow"))

    filename = filename <- paste(s,chambs[c],year)
    ggsave(paste("Plots/",filename,".png"), width = 10, height = 7)
  }     
  return(p)
})

在前几个州都可以正常工作,但是我在第二行geom_point中遇到了问题,该行基本上是用黄色突出显示某些人的方式:

... + geom_point(data=subset(finaldat,st==s & chamber == chambs[c] & highlight>0),aes(col="yellow")) + ...

因为它是数据帧的子集,所以此数据有某些迭代,其中该子集变成了一个空数据帧,因为有时highlight变量中没有人故意将其值设置为大于零,因此我得到错误并停止循环。但是我试图找出一种方法,如果由于该子集为空而出现错误,那么它将忽略那一行。但是我无法找出任何好的ifelse语句或任何使它发生的东西。

下面是数据的示例:

st    chamber    average    score    color    Total    highlight 
AK    Upper      .64        54       1        849      1
AK    Upper      .84        91       1        743      0
AK    Upper      .35        14       2        442      0
AK    Upper      .95        54       1        641      4
AK    Lower      .64        54       1        849      0
AK    Lower      .84        91       1        743      0
AK    Lower      .35        14       2        442      0
AK    Lower      .95        54       1        641      0

在所有州/州/省/直辖市/直辖市/直辖市/自治区/直辖市/直辖市/自治区,但在此示例中,突出显示将适用于AK Upper,但不适用于AK Lower。因此,基本上,当循环到达AK Lower时,我只需要忽略第二个geom_point,因为空子集将导致它出错。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

lapply(unique(finaldat$st), function(s){
  chambs <- unique(finaldat$chamber[finaldat$st == s])
  p <- list(NULL)
  for(c in 1:length(chambs)){
    p[[c]] <- finaldat %>% filter(st == s & chamber == chambs[c]) %>%
      ggplot(aes(x = average, y = score, col = color))+
      geom_point(aes(size= Total,alpha = 0.5)) +
      stat_smooth(method = "lm") -> gg

    if (YOUR TEST HERE) {
      gg <- gg + geom_point(data=subset(finaldat,st==s & chamber == chambs[c] & highlight>0),aes(col="yellow")) +
    }

    gg +
      ggtitle(paste(s,chambs[c],year)) + 
      scale_size(range = c(.5,3.5)) + 
      scale_color_manual(labels = c("1","2","3"), 
                         values = c("blue","red","yellow"))

    filename = filename <- paste(s,chambs[c],year)
    ggsave(paste("Plots/",filename,".png"), width = 10, height = 7)
  }     
  return(p)
})