facet_wrap add geom_hline

前端 未结 2 1410
梦如初夏
梦如初夏 2020-12-01 19:19

I have the following code for my ggplot - the facet_wrap function draws out 20 plots on the page for each Name and there are 5 Pcode along the x-axis. I would like to calcul

相关标签:
2条回答
  • 2020-12-01 19:33

    Minimal example using mtcars - you have to create a data frame with mean for each gear (in your case it's Name).

    library(tidyverse)
    dMean <- mtcars %>%
        group_by(gear) %>%
        summarise(MN = mean(cyl))
    ggplot(mtcars) +
        geom_point(aes(mpg, cyl)) +
        geom_hline(data = dMean, aes(yintercept = MN)) +
        facet_wrap(~ gear)
    

    For your case this should work:

    library(tidyverse)
    dMean <- UKWinners %>%
        group_by(Name) %>%
        summarise(MN = mean(TE.Contr.))
    ggplot(UKWinners) +
        geom_point(aes(Pcode, TE.Contr.)) +
        geom_hline(data = dMean, aes(yintercept = MN)) +
        facet_wrap(~ Name)
    
    0 讨论(0)
  • 2020-12-01 19:55

    You could also create your own stat to calculate the line for you. Adapting the example from the extending ggplot2 guide You can make

    StatMeanLine <- ggproto("StatMeanLine", Stat,
      compute_group = function(data, scales) {
        transform(data, yintercept=mean(y))
      },
      required_aes = c("x", "y")
    )
    
    stat_mean_line <- function(mapping = NULL, data = NULL, geom = "hline",
                           position = "identity", na.rm = FALSE, show.legend = NA, 
                           inherit.aes = TRUE, ...) {
      layer(
        stat = StatMeanLine, data = data, mapping = mapping, geom = geom, 
        position = position, show.legend = show.legend, inherit.aes = inherit.aes,
        params = list(na.rm = na.rm, ...)
      )
    }
    

    Then you could use it like

    ggplot(mtcars, aes(mpg, cyl)) +
      stat_mean_line(color="red") +
      geom_point() +
      facet_wrap(~ gear)
    

    0 讨论(0)
提交回复
热议问题