代码之家  ›  专栏  ›  技术社区  ›  Indrajeet Patil

在{ggplot2}中混合盒子和小提琴情节时保留盒子情节须

  •  0
  • Indrajeet Patil  · 技术社区  · 1 年前

    序言

    假设我有一个功能,允许用户创建一个盒子小提琴图,其中盒子和小提琴图是叠加的。

    library(ggplot2)
    
    df <- dplyr::filter(mpg, class %in% c("compact", "midsize"))
    
    p1 <- ggplot(df, aes(class, hwy)) + geom_violin() + geom_boxplot() 
    
    p1
    

    如果用户愿意,我还想允许他们删除小提琴图,我支持这一点的方式是要求用户将小提琴图的宽度设置为 0 .

    
    p2 <- ggplot(df, aes(class, hwy)) + geom_violin(width = 0) + geom_boxplot() 
    
    p2
    

    创建于2023-12-10 reprex v2.0.2

    问题

    如果您仔细注意到,两个地块之间的长方体地块胡须已经发生了变化。我认为这是因为小提琴图通过插值数据增加了数据的范围,这使得异常点不再是异常点。

    我该如何避免这种情况?也就是说,我如何允许用户在不影响方块胡子的情况下让小提琴情节消失?

    注意:我知道我可以提供一个参数,比如 plot.type 然后根据其论点添加小提琴层。但由于其他原因,这不是我更喜欢的API。

    2 回复  |  直到 1 年前
        1
  •  1
  •   stefan    1 年前

    改变的不是方块图上的胡须。当你设置 width=0 小提琴缩成一条直线。为了避免或完全移除 linewidth=0 也:

    library(ggplot2)
    
    df <- dplyr::filter(mpg, class %in% c("compact", "midsize"))
    
    ggplot(df, aes(class, hwy)) +
      geom_violin(width = 0, linewidth = 0) +
      geom_boxplot()
    

        2
  •  1
  •   Marcos Lima    1 年前

    您可以将颜色和填充参数用作NA,以使任何打印都不可见。

      df <- dplyr::filter(mpg, class %in% c("compact", "midsize"))
      
      p1 <- ggplot(df, aes(class, hwy)) + geom_violin() + geom_boxplot() 
      
      p1
      
      p2 <- ggplot(df, aes(class, hwy)) + geom_violin(color=NA,fill=NA) + geom_boxplot() 
      
      p2
    

    Like this