# Everything is spiraling out of control!

## Making a fun spiral dataviz with R.

I saw this fun bit of R code in a tweet by user aschinchon.

Let’s remix it to make a fun animation. We’ll zoom in and out and have the colors shift.

Click for R code

suppressPackageStartupMessages({
library(tidyverse)
library(tweenr)
library(gifski)
library(viridis)
})

df <- data.frame(x=0, y=0)

for (i in 2:500)
{
df[i,1] <- df[i-1,1]+((0.98)^i)*cos(i)
df[i,2] <- df[i-1,2]+((0.98)^i)*sin(i)
}

# function to make code
myf <- function(rr, fill="#0D0887FF"){
df <- data.frame(x=0, y=0)

for (i in 2:500){
df[i,1] <- df[i-1,1]+((rr)^i)*cos(i)
df[i,2] <- df[i-1,2]+((rr)^i)*sin(i)
}
df$fill <- fill return(df) } # plot g<- ggplot(myf(0.98), aes(x,y,fill=fill)) + geom_polygon()+ scale_fill_identity()+ theme_void()+ labs(caption="@lenkiefer Inspired by R code in tweet from @aschinchon") g # Animate it We can animate it with gifski and tweenr with the following code. Click for R code # change this # Set to your directory mydir<-"YOUR_DIRECTORY" # Create a set of data frames to tween mylist<-list(myf(.970, viridis(8)[1]), myf(.975, viridis(8)[2]), myf(.980, viridis(8)[3]), myf(.985, viridis(8)[4]), myf(.990, viridis(8)[5]), myf(.985, viridis(8)[6]), myf(.980, viridis(8)[7]), myf(.975, viridis(8)[8]), myf(.970, viridis(8)[1]) ) tween.df<-tween_states(mylist,tweenlength=5,statelength=0, ease=rep('cubic-in-out',20), nframes=50) N <- max(tween.df$.frame)

gif_file <- save_gif({for (i in seq(1:N)){
g<-
ggplot(data=filter(tween.df,.frame==i), aes(x,y,fill=fill)) +
geom_polygon()+
scale_fill_identity()+
theme_void()+
coord_cartesian(xlim=c(-1.5,-0.5), ylim=c(-0.25,0.5))+   # zooom in
labs(caption="@lenkiefer Inspired by R code in tweet from @aschinchon")

print(g)
print(paste(i,"out of",N))
}
}, gif_file= paste0(mydir,"/spiral.gif"),width = 620, height = 400, res = 92, delay=1/20)

Running the code yields:

You can play with the colors or change the parameters to speed up or slow down this animation. Adding to nframes in tweenr::tween_states can make the animation smoother. And increasing/decreasing delay in gifski::save_gif() can speed it up/slow it down.