【问题标题】:ggplot: Add a theoretical range on a geom_violin()ggplot:在 geom_violin() 上添加理论范围
【发布时间】:2013-11-26 08:36:01
【问题描述】:

假设我们观察到了两种甲虫。我们想使用 geom_violin() 来比较它们的大小,如下所示:

df = data.frame(species=rep(c('species_a','species_b'),3), size=c(1,1.5,1.2,1.8,1.1,1.9))
ggplot(df, aes(x=species, y=size)) + geom_violin()

知道species_a 的预期大小范围为[0.8,1.8],species_b 的预期大小范围为[1.2, 1.8]...

ranges = list(species_a=c(0.8,1.8), species_b=c(1.2,1.8))

我们怎样才能轻松地在图表上添加这个范围(例如灰色的形状)?

【问题讨论】:

    标签: r graph ggplot2 density-plot


    【解决方案1】:

    你可以试试这个:

    # first, create data frame from list 'ranges'
    df2 <- setNames(object = do.call(rbind.data.frame, ranges), nm = c("min_size", "max_size"))
    df2$species <- rownames(df2)
    
    # plot violins with 'df', and ranges with 'df2'.
    # Set colour and size according to your own "data-ink ratio" preferences.
    ggplot(data = df, aes(x = species)) +
      geom_violin(aes(y = size)) +
      geom_linerange(data = df2, aes(ymax = max_size, ymin = min_size), colour = "grey", size = 3)
    

    【讨论】:

      【解决方案2】:

      将范围与物种名称和最小/最大值放在单独的数据框中

      ranges = data.frame(species=c('species_a','species_b'), 
                          rmin=c(0.8,1.2),rmax=c(1.2,1.8))
      ranges
      
          species rmin rmax
      1 species_a  0.8  1.8
      2 species_b  1.2  1.8
      

      然后使用geom_rect() 的新数据框创建位于geom_violin() 下方的区域。 geom_blank() 用于根据原始数据框制作 x 轴。

      ggplot(df, aes(x=species, y=size))  + geom_blank() + 
        geom_rect(data=ranges,aes(xmin=as.numeric(species)-0.45,
                                  xmax=as.numeric(species)+0.45,
                                  ymin=rmin,ymax=rmax),inherit.aes=FALSE)+
        geom_violin()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        相关资源
        最近更新 更多