Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
421 views
in Technique[技术] by (71.8m points)

r - Display a summary line per facet rather than overall

I am trying to do something similar to this question, but hoping to do it in a single block rather than caching values separately.

I am creating a chart similar to this:

library(tidyverse)

mtcars %>%
  rownames_to_column("carmodel") %>%
  mutate(brand = substr(carmodel, 1, 4)) %>%
  group_by(brand, cyl) %>%
  summarize(avgmpg = mean(mpg)) %>%
  ggplot(aes(x=brand, y = avgmpg)) +
  geom_point() +
  facet_grid(cyl~., scales = "free_y") +
  coord_flip()

enter image description here

Grouping by one of the fields, and then charting a calculated summarize() value on the result, using facets to place similar observations together. What I would like to do is add a line in each facet showing the mean of the observations for that facet. I have tried adding geom_hline(aes(yintercept = mean(avgmpg))) to the definition, but it returns the mean for the entire dataset, not the observations in the facet:

enter image description here

What I'm after is more like this. (The lines here are drawn with an image editor.)

enter image description here

Is this possible?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Because you said you wanted to do it in one block, note that among the many uses of . you can use it in geoms to refer to the original data argument to ggplot(). So here you can do an additional summarise to get the values for geom_vline. I also just reversed the aesthetics in geom_point instead of using coord_flip.

library(tidyverse)

mtcars %>%
  rownames_to_column("carmodel") %>%
  mutate(brand = substr(carmodel, 1, 4)) %>%
  group_by(brand, cyl) %>%
  summarize(avgmpg = mean(mpg)) %>%
  ggplot(aes(y=brand, x = avgmpg)) +
  geom_point() +
  geom_vline(
    data = . %>%
      group_by(cyl) %>%
      summarise(line = mean(avgmpg)),
    mapping = aes(xintercept = line)
    ) +
  facet_grid(cyl~., scales = "free_y")

Created on 2018-06-21 by the reprex package (v0.2.0).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...