Static and moving circles
[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.
After the previous post on the packcircles package for R someone suggested it would be useful to be able to fix the position of selected circles. As a first attempt, I’ve added an optional Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
weights
argument to the circleLayout
function. Weights can be in the range 0-1 inclusive, where a weight of 0 prevents a circle from moving, while a weight of 1 allows full movement. The updated code is at GitHub. Here’s an example where the largest of a set of initially overlapping circles is fixed in place: And here is the code for the example: library(packcircles) library(ggplot2) library(gridExtra) # Generate some random overlapping circles 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) # Index of the largest circle largest.id <- which(xyr$r == max(xyr$r)) ## Generate plot data for the `before` layout dat.before <- circlePlotData(xyr) # Add a column to the plot data for the 'before' circles # to indicate whether a circle is static of free to move dat.before$state <- ifelse(dat.before$id == largest.id, "static", "free") # Run the layout algorithm with a weights vector to fix the position # of the largest circle wts <- rep(1.0, nrow(xyr)) wts[ largest.id ] <- 0.0 res <- circleLayout(xyr, limits, limits, maxiter = 1000, weights=wts) # A plot function to colour circles based on the state column doPlot <- function(dat, title) ggplot(dat) + geom_polygon(aes(x, y, group=id, fill=state), colour="brown1") + scale_fill_manual(values=c("NA", "brown4")) + coord_equal(xlim=limits, ylim=limits) + theme_bw() + theme(axis.text=element_blank(), axis.ticks=element_blank(), axis.title=element_blank(), legend.position="none") + labs(title=title) g.before <- doPlot(dat.before, "before") # Generate a plot for the 'after' circles dat.after <- circlePlotData(res$layout) dat.after$state <- ifelse(dat.after$id == largest.id, "static", "free") g.after <- doPlot(dat.after, "after") grid.arrange(g.before, g.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.