Waterfall Charts in F#

How to make waterfall plots in F# with Plotly.


In [1]:
#r "nuget: Newtonsoft.Json, 12.0.3"
#r "nuget: Plotly.NET,  2.0.0-preview.10"
#r "nuget: Plotly.NET.Interactive,  2.0.0-preview.10"
Installed Packages
  • Newtonsoft.Json, 12.0.3
  • Plotly.NET, 2.0.0-preview.10
  • Plotly.NET.Interactive, 2.0.0-preview.10

Loading extensions from Plotly.NET.Interactive.dll

Added Kernel Extension including formatters for Plotly.NET charts.

Simple Waterfall Chart

In [2]:
open Plotly.NET
open Plotly.NET.TraceObjects
open Plotly.NET.LayoutObjects

let x =
    [ "Sales"
      "Consulting"
      "Net revenue"
      "Purchases"
      "Other expenses"
      "Profit before tax" ]

let y = [ 60; 80; 0; -40; -20; 0 ]

let measure =
    [ StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Total
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Total ]

Chart.Waterfall(
    x = x,
    y = y,
    Measure = measure,
    Connector = WaterfallConnector.init (Line = Line.init (Color = Color.fromString "rgb(63, 63, 63)"))
)
|> GenericChart.mapTrace //Workaround
    (fun t ->
        t?text <- [ "+60";"+80";"";"-40";"-20";"Total" ]
        t?textposition <- "outside"
        t)
Out[2]:

Horizontal Waterfall Chart

In [3]:
open Plotly.NET

let x = [375.; 128.; 78.; 27.; Double.NaN; -327.; -12.; -78.; -12.; Double.NaN; 32.; 89.; Double.NaN; -45.; Double.NaN]

let measure =
    [ StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Total
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Total
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Total
      StyleParam.WaterfallMeasure.Relative
      StyleParam.WaterfallMeasure.Total ]

let y =
    [ "Sales"
      "Consulting"
      "Maintenance"
      "Other revenue"
      "Net revenue"
      "Purchases"
      "Material expenses"
      "Personnel expenses"
      "Other expenses"
      "Operating profit"
      "Investment income"
      "Financial income"
      "Profit before tax"
      "Income tax (15%)"
      "Profit after tax" ]

Chart.Waterfall(
    x = x,
    y = y,
    Measure = measure,
    Orientation = StyleParam.Orientation.Horizontal,
    Connector =
        WaterfallConnector.init (
            ConnectorMode = StyleParam.ConnectorMode.Between,
            Line = Line.init (Color = Color.fromString "rgb(0,0,0)", Dash = StyleParam.DrawingStyle.Solid, Width = 4.)
        )
)
|> Chart.withTitle ("Profit and loss statement 2018")
|> Chart.withTraceName ("2018")
|> Chart.withMarginSize (Left = 150)
Out[3]: