Created
December 1, 2014 15:42
-
-
Save johnDorian/ac3694cc3c56f2fb9ee1 to your computer and use it in GitHub Desktop.
Function to plot secondary axis in ggplot2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| library(ggplot2) | |
| library(gtable) | |
| library(grid) | |
| library(ggthemes) | |
| # extract gtable | |
| ggplot_second_axis <- function(p1, p2){ | |
| p2 <- p2 + theme() %+replace% | |
| theme(panel.background = element_rect(fill = NA)) | |
| grid.newpage() | |
| g1 <- ggplot_gtable(ggplot_build(p1)) | |
| g2 <- ggplot_gtable(ggplot_build(p2)) | |
| # overlap the panel of 2nd plot on that of 1st plot | |
| pp <- c(subset(g1$layout, name == "panel", se = t:r)) | |
| g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, | |
| pp$l, pp$b, pp$l) | |
| # axis tweaks | |
| ia <- which(g2$layout$name == "axis-l") | |
| ga <- g2$grobs[[ia]] | |
| ax <- ga$children[[2]] | |
| ax$widths <- rev(ax$widths) | |
| ax$grobs <- rev(ax$grobs) | |
| ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm") | |
| g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1) | |
| g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) | |
| ia2 <- which(g2$layout$name == "ylab") | |
| ga2 <- g2$grobs[[ia2]] | |
| ga2$rot <- 90 | |
| g <- gtable_add_cols(g, g2$widths[g2$layout[ia2, ]$l], length(g$widths) - 1) | |
| g <- gtable_add_grob(g, ga2, pp$t, length(g$widths) - 1, pp$b) | |
| return(g) | |
| } | |
| # two plots | |
| p1 <- ggplot(mtcars, aes(mpg, disp)) + geom_line(colour = "blue") | |
| p2 <- ggplot(mtcars, aes(mpg, drat)) + geom_line(colour = "red") | |
| f <- ggplot_second_axis(p1,p2) | |
| grid.draw(f) |
There is a small error in line 34.
change
'ia2 <- which(g2$layout$name == "ylab")'
to
'ia2 <- which(g2$layout$name == "ylab-l")'
You should get the right plot.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I've the same problem. How to solve it?
Many thanks