## Doodling With 3d Animated Charts in R

Doodling with some Gapminder data on child mortality and GDP per capita in PPP\$, I wondered whether a 3d plot of the data over the time would show different trajectories over time for different countries, perhaps showing different development pathways over time.

Here are a couple of quick sketches, generated using R (this is the first time I’ve tried to play with 3d plots…)

```library(xlsx)
#dir()
#names(getSheets(wb))

#Set up dataframes
gdp=read.xlsx("indicator gapminder gdp_per_capita_ppp.xlsx", sheetName = "Data")
mort=read.xlsx("indicator gapminder under5mortality.xlsx", sheetName = "Data")

#Tidy up the data a bit
library(reshape2)

gdpm=melt(gdp,id.vars = 'GDP.per.capita',variable.name='year')
gdpm\$year = as.integer(gsub('X', '', gdpm\$year))
gdpm=rename(gdpm, c("GDP.per.capita"="country", "value"="GDP.per.capita"))

mortm=melt(mort,id.vars = 'Under.five.mortality',variable.name='year')
mortm\$year = as.integer(gsub('X', '', mortm\$year))
mortm=rename(mortm, c("Under.five.mortality"="country", "value"="Under.five.mortality"))

#The following gives us a long dataset by country and year with cols for GDP and mortality
gdpmort=merge(gdpm,mortm,by=c('country','year'))

#Filter out some datasets by country
x.us=gdpmort[gdpmort['country']=='United States',]
x.cn=gdpmort[gdpmort['country']=='China',]```

Now let’s have a go at some charts. First, let’s try a static 3d line plot using the scatterplot3d package:

```library(scatterplot3d)

s3d = scatterplot3d(x.cn\$year,x.cn\$Under.five.mortality,x.cn\$GDP.per.capita,
color = "red", angle = -50, type='l', zlab = "GDP.per.capita",
ylab = "Under.five.mortality", xlab = "year")
s3d\$points3d(x.bg\$year,x.bg\$Under.five.mortality, x.bg\$GDP.per.capita,
col = "purple", type = "l")
s3d\$points3d(x.us\$year,x.us\$Under.five.mortality, x.us\$GDP.per.capita,
col = "blue", type = "l")```

Here’s what it looks like… (it’s worth fiddling with the angle setting to get different views):

A 3d bar chart provides a slightly different view:

```s3d = scatterplot3d(x.cn\$year,x.cn\$Under.five.mortality,x.cn\$GDP.per.capita,
color = "red", angle = -50, type='h', zlab = "GDP.per.capita",
ylab = "Under.five.mortality", xlab = "year",pch = " ")
s3d\$points3d(x.bg\$year,x.bg\$Under.five.mortality, x.bg\$GDP.per.capita,
col = "purple", type = "h",pch = " ")
s3d\$points3d(x.us\$year,x.us\$Under.five.mortality, x.us\$GDP.per.capita,
col = "blue", type = "h",pch = " ")```

As well as static 3d plots, we can generate interactive ones using the rgl library.

Here’s the code to generate an interactive 3d plot that you can twist and turn with a mouse:

```#Get the data from required countries - data cols are GDP and child mortality
x.several = gdpmort[gdpmort\$country %in% c('United States','China','Bangladesh'),]

library(rgl)
plot3d(x.several\$year, x.several\$Under.five.mortality,  log10(x.several\$GDP.per.capita),
col=as.integer(x.several\$country), size=3)
```

We can also set the 3d chart spinning….

`play3d(spin3d(axis = c(0, 0, 1)))`

We can also grab frames from the spinning animation and save them as individual png files. If you have Imagemagick installed, there’s a function that will generate the image files and weave them into an animated gif automatically.

It’s easy enough to install on a Mac if you have the Homebrew package manager installed. On the command line:

brew install imagemagick

Then we can generate a movie:

```movie3d(spin3d(axis = c(0, 0, 1)), duration = 10,
dir = getwd())```

Here’s what it looks like:

Handy…:-)