# Squares & Spirals

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

**R - datawookie**, 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.

While trolling the internet aimlessly this morning, this TikTok video caught my attention.

How difficult would it be to replicate that in R?

# Add a new point. # # proportion - How far along the opposite edge should the new point be located? # next_point <- function(p, proportion = 0.1) { L <- length(p) A <- p[[L-3]] B <- p[[L-2]] list(A + (B-A) * proportion) } # Add a series of new points. # make_spiral <- function(p, N = 250) { for (i in seq(N)) { p <- c(p, next_point(p)) } do.call(rbind, p) %>% as.data.frame() %>% setNames(c("x", "y")) %>% mutate( group = row_number() %% 4 ) }

Make a right-handed spiral.

spiral_right <- make_spiral( # Four initial points (a square centred on the origin). list( c(-1, -1), c(-1, +1), c(+1, +1), c(+1, -1), c(-1, -1) ) ) head(spiral_right) x y group 1 -1.0 -1 1 2 -1.0 1 2 3 1.0 1 3 4 1.0 -1 0 5 -1.0 -1 1 6 -0.8 1 2

And a left-handed spiral.

spiral_left <- make_spiral( list( c(-1, -1), c(+1, -1), c(+1, +1), c(-1, +1), c(-1, -1) ) )

Now plot the spirals using `{ggplot2}`

.

plot_spiral <- function(p) { ggplot(p, aes(x, y)) + geom_path(col = "darkgrey", lwd = 0.5) + geom_path(data = p %>% filter(group == 0), lwd = 2) + geom_path(data = p %>% filter(group == 1), lwd = 2) + geom_path(data = p %>% filter(group == 2), lwd = 2) + geom_path(data = p %>% filter(group == 3), lwd = 2) + coord_fixed() + scale_x_continuous(expand = expansion(0, 0)) + scale_y_continuous(expand = expansion(0, 0)) + theme( panel.background = element_rect(fill = "white", colour = NA), panel.grid = element_blank(), panel.border = element_blank(), plot.margin = unit(c(0, 0, 0, 0), "null"), panel.spacing = unit(c(0, 0, 0, 0), "null"), axis.ticks = element_blank(), axis.text = element_blank(), axis.title = element_blank(), axis.line = element_blank(), legend.position = "none", axis.ticks.length = unit(0, "null"), legend.spacing = unit(0, "null") ) }

The two spirals were saved to files `spiral-left.png`

and `spiral-right.png`

.

Then use the `{magick}`

package to concatenate those images together in a grid. And abracadabra!

To

**leave a comment**for the author, please follow the link and comment on their blog:**R - datawookie**.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.