A waterfall plot shows the cumulative effect of sequentially introduced positive or negative values.
To use it, you need to import the 'bistro' module.
%useLatestDescriptors
%use lets-plot
val dataMap = mapOf(
"Accounts" to listOf("Product revenue", "Services revenue", "Fixed costs", "Variable costs"),
"Values" to listOf(830_000, 290_000, -360_000, -150_000),
)
waterfallPlot(dataMap, "Accounts", "Values")
waterfallPlot(dataMap, "Accounts", "Values",
size = 0.75, alpha = 0.15, width = 0.8, totalTitle = "Profit",
hline = elementLine(linetype = "solid", size = 1.0),
connector = elementLine(linetype = "dotted"),
label = elementText(size = 10.0, family = "Courier", face = "bold", color = "flow_type"),
labelFormat = "$,.1~s") +
scaleYContinuous(name = "Values", format = "$,.1~s") +
ggtitle("Company Profit (in USD)") +
ggsize(1000, 500) +
themeMinimal() +
theme(plotTitle = elementText(size = 20.0, face = "bold", hjust = 0.5))
measure
and group
¶val groupSize = 7
val dataWithGroupsMap = mapOf(
"Company" to List(groupSize) { "Badgersoft" } + List(groupSize) { "AIlien Co." },
"Accounts" to listOf("initial", "revenue", "costs", "Q1", "revenue", "costs", "Q2").let { it + it },
"Values" to listOf(200, 200, -100, null, 250, -100, null,
150, 50, -100, null, 100, -100, null),
"Measure" to listOf("absolute", "relative", "relative", "total", "relative", "relative", "total").let { it + it },
)
waterfallPlot(dataWithGroupsMap, "Accounts", "Values", measure = "Measure", group = "Company") +
facetGrid(x = "Company", scales = "free_x")
calcTotal
¶calcTotal = false
disables the calculation of the total.
If the measure
serie is specified however, the calcTotal
setting has no effect.
gggrid(listOf(
waterfallPlot(dataMap, "Accounts", "Values", calcTotal = false),
waterfallPlot(dataWithGroupsMap.entries.associate { (k, v) -> k to v.subList(0, groupSize) },
"Accounts", "Values", measure = "Measure", calcTotal = false),
))
Tooltips for relative and absolute measures should be specified independently.
val relativeTooltips = layerTooltips()
.title("Account: @..xlabel..")
.format("@..initial..", " $,.3~s")
.format("@..value..", " $,.3~s")
.line("@{..flow_type..}d from @..initial.. to @..value..")
.disableSplitting()
gggrid(listOf(
waterfallPlot(dataMap, "Accounts", "Values", relativeTooltips = "detailed", absoluteTooltips = "detailed") + ggtitle("'detailed' tooltips"),
waterfallPlot(dataMap, "Accounts", "Values", relativeTooltips = relativeTooltips, absoluteTooltips = "none") + ggtitle("Custom tooltips"),
))
sortedValue
¶waterfallPlot(dataMap, "Accounts", "Values", sortedValue = true)
threshold
/maxValues
¶gggrid(listOf(
waterfallPlot(dataMap, "Accounts", "Values") + ggtitle("Default"),
waterfallPlot(dataMap, "Accounts", "Values", threshold = 300_000.0) + ggtitle("Specified threshold"),
waterfallPlot(dataMap, "Accounts", "Values", maxValues = 2) + ggtitle("Specified maxValues"),
))