ggplot dotplot: What is the proper use of geom_dotplot?

后端 未结 3 1431
小鲜肉
小鲜肉 2021-02-20 13:51

My purpose is to reproduce this figure [ref] with ggplot2 (author: Hadley Wickham).

Here is my effort based on geom_point and some ugl

3条回答
  •  感动是毒
    2021-02-20 14:39

    Coincidentally, I've also spent the past day fighting with geom_dotplot() and trying to make it show a count. I haven't figured out a way to make the y axis show actual numbers, but I have found a way to truncate the y axis. As you mentioned, coord_cartesian() and limits don't work, but coord_fixed() does, since it enforces a ratio of x:y units:

    library(tidyverse)
    df <- structure(list(x = c(79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105), y = c(1, 0, 0, 2, 1, 2, 7, 3, 7, 9, 11, 12, 15, 8, 10, 13, 11, 8, 9, 2, 3, 2, 1, 3, 0, 1, 1)), class = "data.frame", row.names = c(NA, -27L))
    df <- tidyr::uncount(df, y) 
    
    ggplot(df, aes(x)) +
      geom_dotplot(method = 'histodot', binwidth = 1) +
      scale_y_continuous(NULL, breaks = NULL) + 
      # Make this as high as the tallest column
      coord_fixed(ratio = 15)
    

    Using 15 as the ratio here works because the x-axis is also in the same units (i.e. single integers). If the x-axis is a percentage or log dollars or date or whatever, you have to tinker with the ratio until the y-axis is truncated enough.


    Edited with method for combining plots

    As I mentioned in a comment below, using patchwork to combine plots with coord_fixed() doesn't work well. However, if you manually set the heights (or widths) of the combined plots to the same values as the ratio in coord_fixed() and ensure that each plot has the same x axis, you can get psuedo-faceted plots

    # Make a subset of df
    df2 <- df %>% slice(1:25)
    
    plot1 <- ggplot(df, aes(x)) +
      geom_dotplot(method = 'histodot', binwidth = 1) +
      scale_y_continuous(NULL, breaks = NULL) + 
      # Make this as high as the tallest column
      # Make xlim the same on both plots
      coord_fixed(ratio = 15, xlim = c(75, 110))
    
    plot2 <- ggplot(df2, aes(x)) +
      geom_dotplot(method = 'histodot', binwidth = 1) +
      scale_y_continuous(NULL, breaks = NULL) + 
      coord_fixed(ratio = 7, xlim = c(75, 110))
    
    # Combine both plots in a single column, with each sized incorrectly
    library(patchwork)
    plot1 + plot2 +
      plot_layout(ncol = 1)
    

    # Combine both plots in a single column, with each sized appropriately
    library(patchwork)
    plot1 + plot2 +
      plot_layout(ncol = 1, heights = c(15, 7) / (15 + 7))
    

提交回复
热议问题