Charts: Pareto

import io.data2viz.charts.* import io.data2viz.charts.core.Padding import io.data2viz.charts.core.* import io.data2viz.charts.dimension.* import io.data2viz.charts.chart.* import io.data2viz.charts.chart.mark.* import io.data2viz.charts.viz.* import io.data2viz.charts.layout.* import io.data2viz.charts.config.configs.* import io.data2viz.geom.* private val width = 600.0 private val height = 400.0 fun main() { val vc = newVizContainer().apply { size = Size(width, height) } vc.chart(breaches) { title = "Cybersecurity breaches on the US Dep. of HHS" config { title { padding = Padding(5.0, 5.0, 8.0, 5.0) } } val maxCount = breaches.maxOf { it.cumulativeCount } val typeDim = discrete({domain.type}) { name = "Type of breach" } val countDim = quantitative({domain.count.toDouble()}) { name = "Count" } val percentDim = quantitative({100 * domain.cumulativeCount.toDouble() / maxCount}) { name = "Cumulative count" formatter = { "${this.formatToInteger()}%" } } bar(typeDim, countDim) { y { end = 700.0 } } line(typeDim, percentDim) { strokeWidth = constant(2.0) showMarkers = true y { layoutPosition = LayoutPosition.Right start = .0 end = 100.0 } } } } data class Breach(val type: String, val count: Int, val cumulativeCount: Int) // Since October 2009 organizations in the U.S. that store data on human health are // required to report any incident that compromises the confidentiality of 500 or more // patients / human subjects (45 C.F.R. 164.408) These reports are publicly available. // HHSCyberSecurityBreaches was downloaded from the Office for Civil Rights of the U.S. // Department of Health and Human Services, 2015-02-26 val breaches = listOf( Breach("Theft", 633, 633), Breach("Loss", 111, 744), Breach("Other", 111, 855), Breach("IT Incident", 94, 949), Breach("Improp. Disp.", 51, 1000), Breach("Unknown", 16, 1016), Breach("Unauthorized", 1, 1017) )
pierre avatar

Sketch created by

pierre

A very simple Pareto, showing a way to do it. The data class is used to store the data (name and count) but also the cumulative count. Then the quantitative dimension, computes the cumulative percentage based on the current cumulative count. The bar mark and the line mark share the same discrete X axis, but use 2 differrent quantitative dimension for count and percentage.

comments

Gaetan Zoritchak