Last night, while working on something else that I want to finish, I
ended up indulging in a bit of “yak shaving”. I wondered how easy it
would be to generate graphics in ggplot2 with rounded corners. I don’t
think that there is any native support for this in the theming
system. Therefore, I had to descend into the depths of R’s grid
graphics system. Luckily, I have read Paul Murrell’s beyond excellent
R Graphics book, so I was prepared for the venture.
Making my task even easier was the fact that there now exists the
functionality in grid to generate rectangles with rounded
corners. This is accomplished with the
So, here is my first attempt.
library(ggplot2) p <- qplot(carat, price, data = diamonds[sample(1:nrow(diamonds), 100),]) + geom_smooth() grob <- ggplotGrob(p) plot.rrg <- roundrectGrob(gp = gpar(fill = "skyblue1", col = NA), r = unit(0.06, "npc")) grob <- removeGrob(grob, "plot.background.rect", grep = TRUE) grid.draw(gList(plot.rrg, grob))
As you see, the objective was achieved, but not nearly as cleanly as
I’d like. Essentially, I’m relying on a trick by removing the plot
rectangle grob and creating a new one in a gList. This happens to work
since the new round rectangle is drawn first. Ideally, I’d like to add
the new rounded rectangle grob into the gTree object in the ‘proper’
place, i.e., where the original
was. I assume that is possible if I investigate further. It was not
obvious to me how to do that though. Also, if I wanted the panel
rectangle (grey colored in the figure) to be rounded, I believe I
would have to find a way to replace that grob with a rounded rectangle
at its original location.
So, that was a quick first attempt. The plot was saved using the
function with a transparent background. I will update this post if I
find a cleaner solution. Please let me know if you are aware of how to
add grobs in specific locations in a gTree, since that is what I am
assuming I need to do.