代码之家  ›  专栏  ›  技术社区  ›  Ryan

如果某个子集有时故意为空,如何在ggplot中基于该子集添加第二个几何点?

  •  1
  • Ryan  · 技术社区  · 7 年前

    我有这个代码,工作得很好。基本上,它所做的是通过该州的所有州和议会来绘制每个州和议会的图:

    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
    

    Etc在所有州/商会中都适用,但在本例中,突出显示适用于AK Upper,但不适用于AK Lower。所以基本上,当循环到达AK下限时,我只需要它忽略这一秒 几何点 因为空子集将导致它出错。有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   hrbrmstr    7 年前
    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)
    })
    
    推荐文章