[This article was first published on

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

**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.

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.