Skip to content
GitHub

ChartScatter

ChartScatter manifests describe XY scattergrams: two numeric value axes, one point per data row, points colored by series, selective collision-free labels, optional highlight bands, and hyperbolic iso-lines x·y = k for a third derived measure.

The smallest well-formed ChartScatter sets the required dataset, x and y plus the fields a readable scattergram needs: an axis label and unit on both axes (values are drawn as delivered, so the unit is the only magnitude cue) and a chartTitle carrying the message.

apiVersion: bino.bi/v1alpha1
kind: ChartScatter
metadata:
  name: product_portfolio
spec:
  dataset: products
  chartTitle: "Product portfolio"
  x:
    measure: ac1
    label: "Margin"
    unit: "% of net sales"
  y:
    measure: ac2
    label: "Net sales"
    unit: "mUSD"

All attributes are listed in the Attribute Reference below.

Both axis mappings also accept the short form x: ac1 instead of the object shown above — see Measure tokens.

The x and y mappings accept either a bare measure token or an object whose measure property is a token:

  • Scenario slots: ac1ac4, pp1pp4, fc1fc4, pl1pl4 — the row columns of the dataset.
  • Variance tokens: d<base>_<delta> (absolute) or dr<base>_<delta> (relative), e.g. dac1_pp1 (AC minus PY) or drac1_pl1 (AC vs. plan in percent). An optional _pos/_neg/_neu sentiment suffix is accepted and ignored on axes.

All plain scenario measures across x and y must share one scenario family (e.g. don't mix ac1 with pp2); the family selects the mark treatment through the rule set. Variance tokens don't count toward the family.

A bare string is shorthand for the object form: x: ac1 equals x: { measure: ac1 }.

One dataset row is one point — aggregate in the DataSet SQL; duplicate point identities keep the first row and raise a warning. Values are drawn as delivered (no auto-SI scaling).

  • level picks the hierarchy column that identifies a point (auto uses the deepest populated level of rowGroupcategorysubCategory).
  • seriesLevel picks the level whose values become the color series; it must be strictly above the point level. none renders a single series.
  • facet splits the plot into small-multiple panels on a level above the series level.

Iso-lines require a strictly positive domain on both axes.

  • dataset – required dataset name, inline definition, or array of either.
  • x, y – required axis measure mappings (token or object with measure, label, unit, min, max, refLine, and highlight with from/to; an open end runs to the domain edge).
  • iso – optional iso-line configuration (values, label, unit, highlight.from shades the region where x·y >= from).
  • level, seriesLevel – point identity and series grouping levels.
  • facet – small-multiple configuration (level required, columns).
  • labels – point labels: points is auto (up to max collision-free candidates), all, none, or an explicit list of point names; values adds the measure value. Defaults: points: auto, values: false, max: 12.
  • legend – series legend (show defaults to true, position to right).
  • aspect – plot aspect ratio "w:h" (default 16:9); XY charts have no data-driven height.
  • limit – max points per facet panel, keeping the first rows in dataset order; 0 means unlimited.
  • filter – optional AlaSQL WHERE fragment.
  • chartTitle – optional title.
  • scale – proportional font scaling, same semantics as the other charts (none, auto, or a fixed factor).
  • selectedStyle – optional name of a ComponentStyle to apply; merged over the _system and _default styles.
  • ruleset – optional name of a RuleSet to apply, or inherited-closest / inherited-page to inherit the surrounding layout's rule set.
---
apiVersion: bino.bi/v1alpha1
kind: ChartScatter
metadata:
  name: product_portfolio
spec:
  dataset: products
  chartTitle: "Product portfolio"
  x:
    measure: ac1
    label: "Margin"
    unit: "% of net sales"
    min: 0
    max: 40
  y:
    measure: ac2
    label: "Net sales"
    unit: "mUSD"
    highlight: { from: 30 }
  labels:
    points: auto
    max: 12
---
apiVersion: bino.bi/v1alpha1
kind: ChartScatter
metadata:
  name: gross_profit_scatter
spec:
  dataset: products
  x: { measure: ac1, label: "Margin", unit: "%", min: 0, max: 40 }
  y: { measure: ac2, label: "Net sales", unit: "mUSD", min: 0 }
  iso:
    values: [100, 200, 300]
    label: "Gross profit"
    unit: "mUSD"
    highlight: { from: 300 }

Example: Variance scatter with small multiples

Section titled “Example: Variance scatter with small multiples”
---
apiVersion: bino.bi/v1alpha1
kind: ChartScatter
metadata:
  name: growth_vs_plan
spec:
  dataset: business_units
  x: { measure: drac1_pp1, label: "Growth", unit: "%", refLine: 0 }
  y: { measure: drac1_pl1, label: "Plan deviation", unit: "%", refLine: 0 }
  seriesLevel: rowgroup
  facet:
    level: rowgroup
    columns: 4
AttributeTypeRequiredDefaultDescription
apiVersionstringyesMust be bino.bi/v1alpha1.
kindstringyesMust be ChartScatter.
metadata.namestringyesUnique identifier.
metadata.labelsobjectnoKey-value pairs for categorization and constraint matching.
metadata.annotationsobjectnoArbitrary key-value metadata, not used by the system.
metadata.descriptionstringnoFree-form description.
metadata.constraintsarraynoConditional inclusion rules. See Constraints.
AttributeTypeRequiredDefaultDescriptionSample
spec.datasetstring, object, or arrayyesDataset reference: a name, an inline DataSet definition, or an array of either.dataset: products
spec.xstring or objectyesHorizontal axis measure mapping: a bare measure token or the object below. All plain scenario measures across x and y must share one scenario family. Maps to the x HTML attribute.x: ac1
spec.x.measurestringyes (object form)Scenario slot (ac1ac4, pp1pp4, fc1fc4, pl1pl4) or a variance token (dac1_pp1, drac1_pl1).measure: ac1
spec.x.labelstringnoAxis title displayed next to the axis.label: "Margin"
spec.x.unitstringnoUnit suffix after the axis title. Values are drawn as delivered — scale in the DataSet SQL.unit: "% of net sales"
spec.x.minnumbernodata minimumLower axis domain bound. Points outside an explicit domain are clipped with a warning.min: 0
spec.x.maxnumbernodata maximumUpper axis domain bound. Must be greater than min or both overrides are dropped.max: 40
spec.x.refLinenumbernoDraws a reference line perpendicular to this axis at the given value.refLine: 20
spec.x.highlightobjectnoShades a band of the plot along this axis.highlight: { from: 30 }
spec.x.highlight.fromnumbernodomain startBand start value.from: 30
spec.x.highlight.tonumbernodomain endBand end value.to: 40
spec.ystring or objectyesVertical axis measure mapping, same shape as spec.x. Maps to the y HTML attribute.y: { measure: ac2, unit: "mEUR" }
spec.y.measurestringyes (object form)Scenario slot or variance token for the vertical axis.measure: ac2
spec.y.labelstringnoAxis title displayed next to the axis.label: "Net sales"
spec.y.unitstringnoUnit suffix after the axis title. Values are drawn as delivered — scale in the DataSet SQL.unit: "mUSD"
spec.y.minnumbernodata minimumLower axis domain bound. Points outside an explicit domain are clipped with a warning.min: 0
spec.y.maxnumbernodata maximumUpper axis domain bound. Must be greater than min or both overrides are dropped.max: 100
spec.y.refLinenumbernoDraws a reference line perpendicular to this axis at the given value.refLine: 20
spec.y.highlightobjectnoShades a band of the plot along this axis.highlight: { from: 30 }
spec.y.highlight.fromnumbernodomain startBand start value.from: 30
spec.y.highlight.tonumbernodomain endBand end value.to: 60
spec.isoobjectnoHyperbolic iso-lines x·y = k. Requires a strictly positive domain on both axes. Maps to the iso HTML attribute.iso: { values: [100, 200] }
spec.iso.valuesstring or array of numbersnoIso-line constants: auto derives them from the data, or list explicit k values.values: [100, 200, 300]
spec.iso.labelstringnoCaption of the derived measure, rendered at the iso-line exits.label: "Gross profit"
spec.iso.unitstringnoUnit suffix for the iso-line caption.unit: "mUSD"
spec.iso.highlightobjectnoShades the region where x·y >= from.highlight: { from: 300 }
spec.iso.highlight.fromnumbernoIso value the shading starts at.from: 300
spec.levelstringnoautoPoint identity level (one row = one point, duplicates are dropped with a warning). Values: auto, category, subcategory.level: category
spec.seriesLevelstringnoautoSeries/color level, strictly above the point level. Values: auto, rowgroup, category, none. Maps to the series-level HTML attribute.seriesLevel: rowgroup
spec.facetobjectnoSmall-multiple panels on a hierarchy level above the series level.facet: { level: rowgroup }
spec.facet.levelstringyes (when facet is set)Hierarchy level whose values become the facet panels. Values: rowgroup, category.level: rowgroup
spec.facet.columnsintegernoall panels in one rowNumber of panels per row (≥ 1).columns: 3
spec.labelsobjectnopoints: auto, values: false, max: 12Point label configuration.labels: { points: all }
spec.labels.pointsstring or array of stringsnoautoWhich points get a name label: auto picks up to max collision-free candidates, all labels every point, none disables labels, or list explicit point names.points: none
spec.labels.valuesbooleannofalseRender the measure value with the label.values: true
spec.labels.maxintegerno12Candidate cap when points is auto (≥ 1).max: 8
spec.legendobjectnoshow: true, position: rightSeries legend configuration.legend: { position: bottom }
spec.legend.showbooleannotrueToggles the legend.show: false
spec.legend.positionstringnorightLegend placement. Values: right, bottom.position: bottom
spec.aspectstringno16:9Plot aspect ratio "w:h". XY charts have no data-driven height.aspect: "21:9"
spec.limitintegerno0Max points per facet panel (first rows in dataset order). 0 means unlimited.limit: 50
spec.filterstringno""AlaSQL WHERE clause fragment to filter rows.filter: "category = 'New SBUs'"
spec.chartTitlestringno""Custom chart title. Maps to the chart-title HTML attribute.chartTitle: "Margin vs. net sales"
spec.scalestring or numbernoauto-scale with warningProportional scaling. "none": no scaling. "auto": auto-scale silently. Positive number: fixed factor.scale: auto
spec.i18nNamespacestringnoI18n namespace for this component's labels; missing keys fall back to _system. Resolved at runtime from the nearest ancestor carrying one (card, page, tree, grid, or the artefact) when not set. Maps to the i18n-namespace HTML attribute.i18nNamespace: sales
spec.selectedStylestringnoName of a ComponentStyle manifest to apply. Maps to the selected-style HTML attribute.selectedStyle: corporate-style
spec.rulesetstringnoName of a RuleSet manifest to apply, or inherited-closest / inherited-page. Maps to the ruleset HTML attribute.ruleset: corporate-rules

See ChartBubble for the XY portfolio variant with a third size measure.