Using F# and XPlot for rugby league visualisations

I want an easy way to visualise rugby league match data for the team I support.

It's been a couple of years since I last played around with F# so I'm going to use XPlot which will also give me the chance to look into the impressive ionide and paket. I'm going to start with a scatter chart showing the times tries were conceded each match - I'll continue to add more visualisations as the season progresses.

The end product


How to build it

The first thing to do is fire up vscode and install the ionide-fsharp and ionide-paket extensions, if you've not already done so.

Hit ctrl + shift + p to show all commands and run:

Paket: Init
Paket: Add Nuget Package -> FsLab

Then add a new .fsx file and reference the required packages:

#r "packages/FSharp.Data/lib/net40/FSharp.Data.dll"
#r "packages/XPlot.GoogleCharts/lib/net45/XPlot.GoogleCharts.dll"
#r "packages/Google.DataTable.Net.Wrapper/lib/Google.DataTable.Net.Wrapper.dll"

open System.IO  
open FSharp.Data  
open XPlot.GoogleCharts

The data has been sourced from various match reports. Starting with a subset of data this will be read in from an external JSON file, consisting of an array of rugby matches:

        "opposition": {
            "name": "TheTeamName",
            "tries": [
                {"name":"ThePlayerName", "minute":1}

Read the JSON using the JSON Type Provider

type Matches = JsonProvider<"matches.json">

let matches =  

Points is a list of tuples of type (int, int). The first int is the rugby match, the second is the minute the try is scored.

let points =  
    [for matchIndex in 0..Seq.length matches-1 do
        let theMatch = matches |> Seq.item matchIndex
        let tries = theMatch.Opposition.Tries
        for tryIndex in 0..Seq.length tries-1 do
            let theTry = tries |> Seq.item tryIndex
            yield (matchIndex, theTry.Minute)]

Set graph options:

let options =  
        title = "Minutes tries conceded",
        hAxis = Axis(title = "Match", gridlines = Gridlines(count=matches.Length)),
        vAxis = Axis(title = "Minute", gridlines = Gridlines(count=10), viewWindow = ViewWindow(max=80)),
        bubble = Bubble(textStyle=TextStyle(color="transparent")),
        colors = [| "red" |] )

Create a scatter chart from the points defined above and launch in browser:

let chart =  
    |> Chart.Scatter
    |> Chart.WithOptions options
    |> Chart.WithLabels ["Try"]
    |> Chart.WithSize (800, 300)
    |> Chart.Show

What next?

  • Create other visualisations using the full set of data
  • Explore trends in the visualisations