Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Back in 2010 I posted some R code for circle packing. Now, just five years later, I’ve ported the code to Rcpp and created a little package which you can find at GitHub.

The main function is `circleLayout` which takes a set of overlapping circles and tries to find a non-overlapping arrangement for them. Here’s an example:

And here’s the code:

``# Create some random circles, positioned within the central portion# of a bounding square, with smaller circles being more common than# larger ones.ncircles <- 200limits <- c(-50, 50)inset <- diff(limits) / 3rmax <- 20xyr <- data.frame(  x = runif(ncircles, min(limits) + inset, max(limits) - inset),  y = runif(ncircles, min(limits) + inset, max(limits) - inset),  r = rbeta(ncircles, 1, 10) * rmax)# Next, we use the `circleLayout` function to try to find a non-overlapping# arrangement, allowing the circles to occupy any part of the bounding square.# The returned value is a list with elements for the layout and the number# of iterations performed.library(packcircles)res <- circleLayout(xyr, limits, limits, maxiter = 1000)cat(res\$niter, "iterations performed")# Now draw the before and after layouts with ggplotlibrary(ggplot2)library(gridExtra)## plot data for the `before` layoutdat.before <- circlePlotData(xyr)## plot dta for the `after` layout returned by circleLayoutdat.after <- circlePlotData(res\$layout)doPlot <- function(dat, title)  ggplot(dat) +   geom_polygon(aes(x, y, group=id), colour="brown", fill="burlywood", alpha=0.3) +  coord_equal(xlim=limits, ylim=limits) +  theme_bw() +  theme(axis.text=element_blank(),        axis.ticks=element_blank(),        axis.title=element_blank()) +  labs(title=title)grid.arrange(  doPlot(dat.before, "before"),  doPlot(dat.after, "after"),  nrow=1)``