add layer to specific panel of facet_plot output

[This article was first published on R on Guangchuang YU, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

This is a question from ggtree google group:

Dear ggtree team,

how can I apply a geom_xxx to only one facet panel? For example if i want to get geom_hline(yintersect=1:30) or a geom_text() in the dot panel? I cant see the facet_grid(. ~ var) function call, so I don’t know which subsetting to use. I have already read

  tr <- rtree(30)
  d1 <- data.frame(id=tr$tip.label, val=rnorm(30, sd=3))
  p <- ggtree(tr)
  p2 <- facet_plot(p, panel="dot", data=d1, geom=geom_point, aes(x=val), color='firebrick')
  d2 <- data.frame(id=tr$tip.label, value = abs(rnorm(30, mean=100, sd=50)))
  p3 <- facet_plot(p2, panel='bar', data=d2, geom=geom_segment, aes(x=0, xend=value, y=y, yend=y), size=3, color='steelblue') + theme_tree2()

Thanks! Andreas

If this can be done, we can create even more comprehensive tree plots.

In fact, it’s quite easy to do. In facet_plot, ggtree used a variable .panel to store the panel information. We can add a dummy column .panel to our data and pass it to geom layer function and the layer will be added to selected panel we specify in the .panel column.

To follow up the above example, we can create a data.frame that contains y and .panel="dot" as we want to add horizontal lines in dot panel.

d=data.frame(y=1:30, .panel='dot')
p3 + geom_hline(data=d, aes(yintercept=y))

Here is what we can get:

The xlim_expand is actually adding a geom_blank layer to selected panel for setting x-axis limits of that panel.

Another approach is using facet_plot with panel parameter setting to existing one.

An example is posted in google group:


tr <- rtree(30)
p <- ggtree(tr) + theme_tree2() 

df <- data.frame(id = rep(tr$tip.label, each=2),
                 value = abs(rnorm(60, mean=100, sd=50)),
                 category = rep(LETTERS[1:2], 30))

sum_value <- df %>%
    group_by(id) %>%
    summarize(total = sum(value))

p2 <- facet_plot(p, panel = 'Stacked Barplot', 
                 data = df, geom = geom_barh,
                 mapping = aes(x = value, fill = as.factor(category)),
                 stat='identity' ) 

facet_plot(p2, panel='Stacked Barplot',
           data=sum_value, geom=geom_text, 
           mapping=aes(x=total+20, label=round(total)))                     


G Yu, DK Smith, H Zhu, Y Guan, TTY Lam*. ggtree: an R package for visualization and annotation of phylogenetic trees with their covariates and other associated data. Methods in Ecology and Evolution. doi:10.1111/2041-210X.12628.

To leave a comment for the author, please follow the link and comment on their blog: R on Guangchuang YU. offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)