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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果有时该子集有意为空,如何在ggplot中添加第二个geom_point?相关的知识,希望对你有一定的参考价值。

我有这个代码非常好用。基本上它所做的是通过该州的所有州和商会来制作每个州的情节:

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,因为空子集会导致它出错。有任何想法吗?

答案
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)
})

以上是关于如果有时该子集有意为空,如何在ggplot中添加第二个geom_point?的主要内容,如果未能解决你的问题,请参考以下文章

如何在闪亮中使用 ggplot2 绘制数据框的子集

根据ggplotly图表上的点击事件对数据框进行子集

带有子集的 ggplot 图例

如何避免空的xml文件

如何判断一个集合是不是是集合的真子集?

如何在 ggplot2 的多面图的单个标签中使用特殊字符、上标或下标?