Circle packing in R (again)
[This article was first published on Last Resort Software, 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.
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.Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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 <- 200 limits <- c(-50, 50) inset <- diff(limits) / 3 rmax <- 20 xyr <- 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 ggplot library(ggplot2) library(gridExtra) ## plot data for the `before` layout dat.before <- circlePlotData(xyr) ## plot dta for the `after` layout returned by circleLayout dat.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)
To leave a comment for the author, please follow the link and comment on their blog: Last Resort Software.
R-bloggers.com 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.