An F# library that allows to define and display a chart as a collection of plots such as line, band, markers, heatmap. Supports visualization of uncertain values represented as quantiles.
Also, there is a similar TypeScript component ChartViewer.
Each sample is represented as an F# module containing function samples: unit -> Chart list
. It builds
the list of sample charts, so that then all the charts can be rendered using Angara.Html
library to an html file:
module Program
open Angara.Charting
type SampleCharts =
{ Lines: Chart list
; Band: Chart list
; Markers: Chart list
; Heatmap: Chart list }
[<EntryPoint>]
let main argv =
let samples =
{ Lines = Line.samples()
; Band = Band.samples()
; Markers = Markers.samples()
; Heatmap = Heatmap.samples() }
Angara.Html.Save "Angara.Chart.SampleGallery.html" samples
0
All the samples below will use the Data
module to get sample data series. We use Angara.Table library to read data from CSV file.
module Data
open Angara.Charting
let wheat = Table.ReadFile("wheat.csv")
let uwheat = Table.ReadFile("uwheat.csv")
let site = Table.ReadFile("site.csv")
let npz = Table.ReadFile("npz.csv")
let grid = Table.ReadFile("grid.csv")
let ugrid = Table.ReadFile("ugrid.csv")
let col colName = Tables.ToArray<float[]> colName
let quantiles prefix table =
{ median = table |> col (prefix + "_median")
lower68 = table |> col (prefix + "_lb68")
upper68 = table |> col (prefix + "_ub68")
lower95 = table |> col (prefix + "_lb95")
upper95 = table |> col (prefix + "_ub95") }
module Line
open Angara.Charting
let samples() =
let t = Data.site |> Data.col "t"
let p = Data.site |> Data.col "p"
let p_uncertain = Data.npz |> Data.quantiles "p"
[
[ Plot.line(t, p) ] |> Chart.ofList
[ Plot.line(Array.init 100 (fun i -> let x = float(i)/10.0 in x*x), stroke = "#7F7F7F", thickness = 3.0) ] |> Chart.ofList
[ Plot.line(LineX.Values t, LineY.UncertainValues p_uncertain) ] |> Chart.ofList
]
module Markers
open Angara.Charting
let samples() =
let lon = Data.wheat |> Data.col "Lon"
let lat = Data.wheat |> Data.col "Lat"
let wheat = Data.wheat |> Data.col "wheat"
let wheat_uncertain = Data.uwheat |> Data.quantiles "w"
[
[ Plot.markers(lon, lat, displayName = "Lat/lon") ] |> Chart.ofList
[ Plot.markers(lon, lat,
color = MarkersColor.Values wheat, colorPalette = "0=Red=Green=Yellow=Blue=10",
shape = MarkersShape.Circle, displayName = "Lat/lon/color")] |> Chart.ofList
[ Plot.markers(lon, lat,
color = MarkersColor.Values wheat, colorPalette = "0=Red=Green=Yellow=Blue=10",
size = MarkersSize.Values wheat, sizeRange = (5.0, 25.0),
shape = MarkersShape.Diamond, displayName = "Lat/lon/color/size")] |> Chart.ofList
[ Plot.markers(lon, lat,
color = MarkersColor.UncertainValues wheat_uncertain,
size = MarkersSize.Value 15.0,
shape = MarkersShape.Circle, displayName = "uncertain color")] |> Chart.ofList
[ Plot.markers(lon, lat,
color = MarkersColor.Values wheat_uncertain.median,
size = MarkersSize.UncertainValues wheat_uncertain, sizeRange = (5.0, 25.0),
displayName = "uncertain size")] |> Chart.ofList
[ Plot.markers(MarkersX.Values lat, MarkersY.UncertainValues wheat_uncertain,
displayName = "uncertain y")] |> Chart.ofList
]
module Band
open Angara.Charting
let samples() =
let t = Data.site |> Data.col "t"
let p_lb95 = Data.npz |> Data.col "p_lb95"
let p_ub95 = Data.npz |> Data.col "p_ub95"
[
[ Plot.band(t, p_lb95, p_ub95) ] |> Chart.ofList
]
module Heatmap
open Angara.Charting
let samples() =
let lon = Data.grid |> Data.col "lon"
let lat = Data.grid |> Data.col "lat"
let value = Data.grid |> Data.col "value"
let lon2 = Data.ugrid |> Data.col "lon"
let lat2 = Data.ugrid |> Data.col "lat"
let value_uncertain = Data.ugrid |> Data.quantiles "value"
[
[ Plot.heatmap(lon, lat, value) ] |> Chart.ofList
[ Plot.heatmap(lon, lat, value, treatAs = HeatmapTreatAs.Discrete) ] |> Chart.ofList
[ Plot.heatmap(lon2, lat2, HeatmapValues.TabularUncertainValues value_uncertain, colorPalette = "blue,white,yellow,orange") ] |> Chart.ofList
]