Interactive Charts

Open-source data visualisations

I'm sharing some inspiring visualisations I explored with workshop participants at a datavis workshop in Ghana this week. They provide an overview of popular software packages for interactive graphs.

See here for the course materials.


Overview

For other R libraries, see leaflet, htmlwidgets, plotly and useful tutorials on data visualisation in R at flowingdata.com.

Many of the packages below require that you have Rtools installed in addition to base R. I also recommend using RStudio as a front end.


A. The rCharts package

The rCharts package allows you to create, customize and publish interactive javascript visualizations from R using a lattice style plotting interface.

To get started, open R and install and load the package as follows.

library(devtools)
install_github('ramnathv/rCharts')

Then you can start exploring the examples using pre-loaded datasets or your own data. For more examples, check out the rCharts gallery.


A.1. Population pyramid
library(rCharts)
source('http://klein.uk/R/Viz/pyramids.R')

## Select population counts for Qatar in 2014
dat <- getAgeTable2(country='QA', year=2014)
head(dat)
Year Age total Male Female percent pctMale pctFemale sexratio ord
2 2014 0-4 101272 51253 50019 4.8 3.1 10.3 102.5 1
3 2014 5-9 88869 45308 43561 4.2 2.8 9.0 104.0 2
4 2014 10-14 74976 37916 37060 3.5 2.3 7.6 102.3 3
5 2014 15-19 87906 55349 32557 4.1 3.4 6.7 170.0 4
6 2014 20-24 196261 152929 43332 9.2 9.3 8.9 352.9 5
7 2014 25-29 322775 259540 63235 15.2 15.8 13.0 410.4 6
n1 <- nPyramid(dat, colors = c('darkred', 'silver'))
n1


Back to top


A.2. Data table
## Load data
SchoolsGroup <- read.csv("https://raw.github.com/patilv/rChartsTutorials/master/SchoolsGroup.csv")
head(SchoolsGroup)
X Group.1 Group.2 Group.3 Group.4
1 Texas Cincinnati Kentucky Bowling Green
2 Ohio State Memphis Louisville William & Mary
3 Michigan Air Force South Carolina Montana
4 Alabama South Florida Minnesota North Dakota
5 Florida Boise State Washington South Alabama
6 Texas A&M New Mexico North Carolina Maine
## Load styles
tab2 <- dTable(SchoolsGroup[,-1], sPaginationType = "full_numbers")
tab2$templates$script <- "https://timelyportfolio.github.io/rCharts_dataTable/chart_customsort.html" 

## Set column names
tab2$params$table$aoColumns =
  list(
    list(sType = "string_ignore_null", sTitle = "Group 1"),
    list(sType = "string_ignore_null", sTitle = "Group 2"),
    list(sType = "string_ignore_null", sTitle = "Group 3"),
    list(sType = "string_ignore_null", sTitle = "Group 4")
  )

## Produce data table
n1 <- tab2
n1



Back to top


B. The googleVis package

The googleVis package provides an interface to Google Charts API, allowing users to create interactive charts based on R data frames.


B.1. Tree map
## Load the googleVis library
library(googleVis)

## Inspect data
head(Regions)
Region Parent Val Fac
Global NA 10 2
America Global 2 4
Europe Global 99 11
Asia Global 10 8
France Europe 71 2
Sweden Europe 89 3
## Plot
Tree <- gvisTreeMap(Regions,  
                    "Region", "Parent", 
                    "Val", "Fac", 
                    options=list(fontSize=16))
plot(Tree)


Back to top


B.2. Sankey chart
datSK <- data.frame(From=c(rep("A",3), rep("B", 3)),
                    To=c(rep(c("X", "Y", "Z"),2)),
                    Weight=c(5,7,6,2,9,4))
head(datSK)
From To Weight
A X 5
A Y 7
A Z 6
B X 2
B Y 9
B Z 4
Sankey <- gvisSankey(datSK, from="From", to="To", weight="Weight",
                     options=list(
                       sankey="{link: {color: { fill: '#d799ae' } },
                            node: { color: { fill: '#a61d4c' },
                            label: { color: '#871b47' } }}"))
plot(Sankey)


Back to top


B.3. Calendar chart
head(Cairo)
Date Temp
2558 2002-01-01 13.61111
2559 2002-01-02 15.16667
2560 2002-01-03 12.00000
2561 2002-01-04 12.00000
2562 2002-01-05 13.05556
2563 2002-01-06 10.05556
Cal <- gvisCalendar(Cairo, 
                    datevar="Date", 
                    numvar="Temp",
                    options=list(
                      title="Daily temperature in Cairo",
                      height=320,
                      calendar="{yearLabel: { fontName: 'Times-Roman',
                               fontSize: 32, color: '#1A8763', bold: true},
                               cellSize: 10,
                               cellColor: { stroke: 'red', strokeOpacity: 0.2 },
                               focusedCellColor: {stroke:'red'}}")
)
plot(Cal)


Back to top


B.4. Pie chart
head(CityPopularity)
City Popularity
New York 200
Boston 300
Miami 400
Chicago 500
Los Angeles 600
Houston 700
Pie <- gvisPieChart(CityPopularity)
plot(Pie)


Back to top


B.5. Geo chart
head(Exports)
Country Profit Online
Germany 3 TRUE
Brazil 4 FALSE
United States 5 TRUE
France 4 TRUE
Hungary 3 FALSE
India 2 TRUE
Geo=gvisGeoChart(Exports, locationvar="Country", 
                 colorvar="Profit",
                 options=list(projection="kavrayskiy-vii"))
plot(Geo)


Back to top


B.6. Motion chart
head(Fruits)
Fruit Year Location Sales Expenses Profit Date
Apples 2008 West 98 78 20 2008-12-31
Apples 2009 West 111 79 32 2009-12-31
Apples 2010 West 89 76 13 2010-12-31
Oranges 2008 East 96 81 15 2008-12-31
Bananas 2008 East 85 76 9 2008-12-31
Oranges 2009 East 93 80 13 2009-12-31
M <- gvisMotionChart(Fruits, 'Fruit', 'Year',
         options=list(width=400, height=350))
plot(M)


Back to top


Back to top


C. The rMaps package

The rMaps package makes it easy to create, customize and share interactive maps from R, with a few lines of code. It supports several javascript based mapping libraries like Leaflet, DataMaps and Crosslet.

To get started, open R and install and load the package as follows.

library(devtools)
install_github('ramnathv/rMaps')

C.1. Leaflet heat maps
## 1. Create map
library(rMaps)
L2 <- Leaflet$new()
L2$setView(c(29.7632836,  -95.3632715), 15)
L2$tileLayer(provider = "MapQuestOpen.OSM")
L2
## 2. Get data
data(crime, package="ggmap")
library(plyr)
crime_dat <- ddply(crime, .(lat, lon), summarise, count = length(address))
head(crime_dat)
lat lon count
27.50711 -99.50555 1
29.48361 -95.06187 10
29.52218 -95.05838 5
29.52218 -95.05838 8
29.52367 -95.05804 2
29.53743 -95.11919 1
## 3. Transform to json format
crime_dat <- rCharts::toJSONArray2(na.omit(crime_dat), json = F, names = F)

## 4. Add leaflet-heat plugin. 
L2$addAssets(jshead = c(
  "https://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"
))

## 5. Add javascript to modify underlying chart
L2$setTemplate(afterScript = sprintf("<script> var addressPoints = %s
  var heat = L.heatLayer(addressPoints).addTo(map) </script>", 
  rjson::toJSON(crime_dat)
))
L2


Back to top


C.2. Animated choropleths
## Get data
library(Quandl)
vcData <- Quandl("FBI_UCR/USCRIME_TYPE_VIOLENTCRIMERATE")
head(vcData[,1:6])
Year Alabama Alaska Arizona Arkansas California
2010-12-31 377.8 638.8 408.1 505.3 440.6
2009-12-31 450.1 633.4 426.5 515.8 473.3
2008-12-31 451.3 650.9 481.2 504.6 506.2
2007-12-31 447.9 662.3 514.5 532.6 522.6
2006-12-31 425.2 686.8 545.4 557.2 533.3
2005-12-31 433.0 632.0 512.0 528.0 526.0
## Reshape data
library(reshape2)
datm <- melt(vcData, 'Year', 
  variable.name = 'State',
  value.name = 'Crime'
)
datm <- subset(na.omit(datm), 
  !(State %in% c("United States", "District of Columbia"))
)

## Discretize crime rates
datm2 <- transform(datm,
  State = state.abb[match(as.character(State), state.name)],
  fillKey = cut(Crime, quantile(Crime, seq(0, 1, 1/5)), labels = LETTERS[1:5]),
  Year = as.numeric(substr(Year, 1, 4))
)

## Associate fill colors
fills = setNames(
  c(RColorBrewer::brewer.pal(5, 'YlOrRd'), 'white'),
  c(LETTERS[1:5], 'defaultFill')
)

## Create payload for data maps
library(plyr); library(rMaps)
dat2 <- dlply(na.omit(datm2), "Year", function(x){
  y = rCharts::toJSONArray2(x, json = F)
  names(y) = lapply(y, '[[', 'State')
  return(y)
})

## Create simple choropleth
options(rcharts.cdn = TRUE)
map <- Datamaps$new()
map$set(
  dom = 'chart_1',
  scope = 'usa',
  fills = fills,
  data = dat2[[46]],
  legend = TRUE,
  labels = TRUE
)
map



## Animated choropleth
map2 = map$copy()
map2$set(
  bodyattrs = "ng-app ng-controller='rChartsCtrl'"
)
map2$addAssets(
  jshead = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.1/angular.min.js"
)

map2$setTemplate(chartDiv = "
  <div class='container'>
    <input id='slider' type='range' min=2005 max=2010 ng-model='year' width=200>
    <span ng-bind='year'></span>
    <div id='' class='rChart datamaps'></div>  
  </div>
  <script>
    function rChartsCtrl($scope){
      $scope.year = 2005;
      $scope.$watch('year', function(newYear){
        map.updateChoropleth(chartParams.newData[newYear]);
      })
    }
  </script>"
)
map2$set(newData = dat2)
map2


Back to top

Comments

comments powered by Disqus