26

How do you specify different geoms for different facets in a ggplot?

(Asked on behalf of @pacomet, who wanted to know.)

Community
  • 1
  • 1
Richie Cotton
  • 118,240
  • 47
  • 247
  • 360

2 Answers2

51

here is another approach by subsetting data:

ggplot(mtcars, aes(mpg, disp)) + facet_wrap(~cyl) + 
  geom_point(data = subset(mtcars, cyl == 4)) +
  geom_line(data = subset(mtcars, cyl == 6)) +
  geom_text(data = subset(mtcars, cyl == 8), aes(label = gear))

enter image description here

kohske
  • 65,572
  • 8
  • 165
  • 155
3

Here's some sample data with 5 groups (g). We want a different geom type in the fifth facet. Notice the trick of creating two different versions of the y variable, one for the first four facets, and one for the fifth.

dfr <- data.frame(
  x = rep.int(1:10, 5),
  y = runif(50),
  g = gl(5, 10)
)
dfr$is.5 <- dfr$g == "5"
dfr$y.5 <- with(dfr, ifelse(is.5, y, NA)) 
dfr$y.not.5 <- with(dfr, ifelse(is.5, NA, y))

If the different geoms can use the same aesthetics (like point and lines), then it isn't a problem.

(p1 <- ggplot(dfr) +
  geom_line(aes(x, y.not.5)) +
  geom_point(aes(x, y.5)) +
  facet_grid(g ~ .)
)

However, a line plot and a bar chart require different facets, so they don't work toegther as expected.

(p2 <- ggplot(dfr) +
  geom_line(aes(x, y.not.5)) +
  geom_bar(aes(y.5)) +
  facet_grid(g ~ .)
)

In this case it is better to draw two separate graphs, and perhaps combine them with Viewport.

Richie Cotton
  • 118,240
  • 47
  • 247
  • 360