Documentation

    Hosted installer: at launch

    Charts

    All reference topics

    Charts

    YAML
    type: line
    title: Churn turned in Q2
    subtitle: The mature cohorts improved first.
    data:
      inline:
        - {month: Jan, churn: 0.08, cohort: Existing}
        - {month: Feb, churn: 0.06, cohort: Existing}
    encoding: {x: month, y: churn, color: cohort}
    axes:
      x: {label: Month}
      y: {label: Churn, format: percent}
    annotations:
      - {kind: line, at: {y: 0.07}, text: Target}
    style: {ratio: '16:9', palette: scientific}
    

    Charts require a supported type, a title that states the claim (a missing one is block.schema and the block stays visible as source), and data and encoding mappings. A channel the type does not read, or a required one that is missing, is block.schema, and a channel, highlight.by, annotation anchor or table column that names a column the data lacks is block.field. subtitle is optional. stack: true stacks the series of a bar or area chart that has encoding.color; wide: true takes the full report width; digits and readout_digits set the significant digits (2 to 6) of printed numbers and readouts.

    TypeRequired channelsOptional channelsDraws
    linex and ycolor, facet and detailValues over a time axis, one line per series.
    barx and ycolor, facet and detailValues per category, one bar per series.
    scatterx and ycolor, size, label, facet and detailPoints on two numeric axes, optionally sized and labelled.
    areax and ycolor, facet and detailValues over a time axis, filled to the baseline.
    piex and yfacet and detailShares of a total by category.
    heatmapx, y and colorfacet and detailA grid of cells coloured by a numeric value.
    histogramxcolor, facet and detailCounts of one numeric field in bins.
    boxplotyx, color, facet and detailThe distribution of a numeric field per category.
    intervalx, lower and uppery, color, facet and detailAuthored lower and upper bounds per category, with an optional estimate.
    waterfallx and ymeasure, color, facet and detailSigned steps from a start to a total, each step drawn from the running level.
    treemaplabel and yparent, color, facet and detailA hierarchy of named parts whose tile areas are their values.
    funnelx and ydetailStages from first to last as centred bands as wide as their values.
    dumbbellx, lower and uppercolor, facet and detailA line per category between two values, with a hollow start and a filled end.
    bandx, lower and uppery, color, facet and detailA filled range between a lower and an upper value over x, with an optional line for a central value.
    bulletx and ytarget, facet and detailA value bar against a target, with optional shaded ranges, per category.
    candlestickx, open, high, low and closefacet and detailOpen, high, low and close per period, drawn as a body with wicks.
    iciclelabel and yparent, color, facet and detailA hierarchy as stacked bands by depth; widths are shares of the whole.
    mapregion and yfacet and detailRegions shaded by value.
    ohlcx, open, high, low and closefacet and detailOpen, high, low and close per period, drawn as ticks on a vertical bar.
    radarx and ycolor, facet and detailSpokes at equal angles with one polygon per group.
    sunburstlabel and yparent, color, facet and detailA hierarchy as rings by depth; angles are shares of the whole.
    paretox and yfacet and detailBars sorted from the largest down with a running share of the total on a second axis.
    treelabelparent, y, facet and detailA hierarchy as nodes joined by elbow curves, with an optional value per node.
    combox, y and linefacet and detailBars for one measure with a line for another on a second axis.
    rosex and ycolor, facet and detailBars around a circle, one per category, with radius as the value.
    wafflex and ycolor, facet and detailA grid of squares in which each category fills a share of the whole.
    gaugeyx and facetOne value on an arc, with optional bands that split the scale.
    calendarx and yfacetA square for each day in week columns, coloured by value, one strip per year.
    streamgraphx and ycolor and facetStacked areas around a moving centre line, one stream per group, thickness as the value.
    ribbonx and ycolor and facetStacked bars ranked by value in each category, with ribbons joining each group across categories.
    sankeysource, target and yfacetFlows between named nodes as ribbons as wide as their values, in columns by longest path from a source.
    alluvialdimensionsy and facetRows as paths through several categorical fields, drawn as ribbons between the categories of neighbouring columns.
    chordsource, target and yfacetNodes as arcs around a circle sized by their flow, with ribbons between them as wide as the flow they carry.
    networksource and targety and facetNodes joined by lines in a fixed force layout, with node size by number of links and an optional value that widens each line.
    lollipopyx, color, facet and detailA stem from zero with a dot at the value, per category.
    violinx and ycolor and facetThe distribution of a numeric field per category as a mirrored density shape with quartiles and median.
    dotplotxcolor and facetCounts of one numeric field in equal-width intervals, one stacked dot for every observation.
    bin2dx and yfacetCounts of observations in a grid of rectangles over two numeric fields, coloured by count.
    hexbinx and yfacetCounts of observations in a tiling of hexagons over two numeric fields, coloured by count.
    densityxcolor, facet and detailA smooth estimate of how values are spread, one filled curve per group.
    ecdfxcolor, facet and detailA step line of the share of values at or below each value, per group.
    qqycolor, facet and detailSample values against normal quantiles, with a quartile reference line.
    stripyx, color, facet and detailEvery observation as a point, spread sideways so none hide, per category.
    splomdimensionslabel, color and facetEvery pair of several numeric fields as a small scatterplot in a grid, with the field names on the diagonal.
    paralleldimensionslabel, color and facetA vertical axis for each of several numeric fields, scaled to its own range, with one line per row across them.
    ganttlabel, start and endcolor and facetOne bar per task from its start to its end on a time axis, tasks in source order.
    contourx, y and zfacetIso-lines of a value over the plane at round levels, coloured along the style’s ramp, with a key.
    packed-bubblelabel and ycolor and facetCircles packed together, each as large in area as its value, coloured by group.
    wordcloudlabel and yfacetWords sized by their values, packed together without overlap.
    vennsets and yfacetTwo or three overlapping circles whose areas are the sets’ sizes and whose overlaps are drawn at their own sizes.
    vectorx, y and anglesize and facetAn arrow at each position pointing in the direction of its angle, optionally as long and as coloured as its value.
    flowlabelsource, target, lane, y and facetSteps in columns by order, optionally in lanes, joined by right-angled connections that go around the steps.
    pivotrows, columns and valuesA matrix of sums with row, column and grand totals, as in a spreadsheet pivot table.
    surfacex, y and zA mesh of z over the x-y plane seen from a set angle, coloured by z.
    scatter3dx, y and zcolor, size and labelPoints in a box seen from a set angle, nearer dots larger, coloured by group and sized by a value.
    bar3dx and ycolorBars as boxes on a grid of two categories, seen from a set angle, with the height as the value.
    FieldTypeRequiredDefaultMeaning
    typechart typeyesThe chart type.
    titletextyesThe title that states the claim; it is the caption heading and the chart’s accessible name.
    subtitletextA line under the title.
    stacktrue or falsefalseStacks the series of a bar or area chart; needs encoding.color.
    widetrue or falsefalseDraws the chart at the full report width.
    digitswhole number of significant digits from 2 to 6Significant digits of the chart’s printed numbers, not decimal places. Omit to use the default.
    readout_digitswhole number of significant digits from 2 to 6Significant digits of the hover readout, not decimal places; never fewer than digits. Omit to use the chart precision.
    highlightmappingNames the scatter points that always get a label.
    highlight.bycolumn nameyesThe column whose values include matches.
    highlight.includelist of text, number or true/falseyesThe values to label; at least one.
    highlight.prioritylist of text, number or true/falseValues that win a label slot first.
    datadata sourceyesThe chart’s data; exactly one local source is allowed.
    data.inlinelist of mappingRows written in the block, each a mapping of column to value.
    data.csvreport-folder fileA CSV file inside the report folder.
    data.jsonreport-folder fileA JSON file of row mappings inside the report folder.
    data.urlhttp or https addressAn https data source; current native and browser hosts do not load this field.
    data.sqlmappingA SQL query run through a named connector on a host that has a registry.
    data.sql.connectortextyesThe name of the connector that runs the query.
    data.sql.queryreport-folder fileA report-relative file holding the SQL; set this or inline, not both.
    data.sql.inlinetextThe SQL text itself; set this or query, not both.
    data.metricflowmappingA MetricFlow query run through a named connector.
    data.metricflow.connectortextyesThe name of the connector that runs the query.
    data.metricflow.metricslist of textyesThe metric names to query; at least one.
    data.cachemappingA reference to a cached connector result.
    data.cache.keytextyesThe key of the cached result.
    data.sql.paramsmappingNamed values passed to the query.
    data.sql.cachemappingHow long the query’s result is reused.
    data.sql.cache.keytextThe key of the cached result.
    data.sql.cache.ttltextHow long the result stays fresh, such as 1h.
    data.sql.cache.freshnesstextA freshness rule for the result.
    data.sql.cache.refreshtrue or falseWhether every run refreshes the result.
    data.metricflow.group_bylist of textThe dimensions to group by.
    data.metricflow.wherelist of textFilters on the query.
    data.metricflow.order_bylist of textThe order of the rows.
    data.metricflow.limitwhole numberThe most rows returned.
    data.metricflow.cachemappingHow long the query’s result is reused.
    data.metricflow.cache.keytextThe key of the cached result.
    data.metricflow.cache.ttltextHow long the result stays fresh, such as 15m.
    data.metricflow.cache.freshnesstextA freshness rule for the result.
    data.metricflow.cache.refreshtrue or falseWhether every run refreshes the result.
    data.cache.ttltextHow long the result stays fresh.
    encodingmappingyesMaps data columns to chart channels.
    encoding.xcolumn nameThe column on the x axis or the categories.
    encoding.ycolumn nameThe column that gives the values.
    encoding.lowercolumn nameThe column with each interval’s lower bound; interval charts only.
    encoding.uppercolumn nameThe column with each interval’s upper bound; interval charts only.
    encoding.colorcolumn nameThe column whose distinct values become series.
    encoding.sizecolumn nameThe column that sizes bubbles on a scatter chart, or gives the length and colour of the arrows of a vector chart.
    encoding.labelcolumn nameThe column whose values label scatter points.
    encoding.facetcolumn nameThe column whose distinct values split the chart into panels.
    encoding.targetcolumn nameBullet: the column that gives each target. Sankey, chord, network and flow: the column with the node each link ends at.
    encoding.dimensionslist of column nameAlluvial: the columns of categories, in order from left to right. Parallel coordinates and scatterplot matrix: the numeric columns drawn as axes. At least two.
    encoding.sourcecolumn nameSankey, chord, network and flow: the column with the node each link starts at.
    encoding.opencolumn nameCandlestick and OHLC: the opening value.
    encoding.highcolumn nameCandlestick and OHLC: the highest value.
    encoding.lowcolumn nameCandlestick and OHLC: the lowest value.
    encoding.closecolumn nameCandlestick and OHLC: the closing value.
    encoding.regioncolumn nameMap only: the column naming each region.
    encoding.linecolumn nameCombo only: the column drawn as a line on the second axis.
    encoding.startcolumn nameGantt only: the column holding each task’s start, as a date or a number.
    encoding.endcolumn nameGantt only: the column holding each task’s end, as a date or a number of the same kind as the start.
    encoding.rowscolumn namePivot only: the column whose values head the rows of the matrix.
    encoding.columnscolumn namePivot only: the column whose values head the columns of the matrix.
    encoding.valuescolumn namePivot only: the numeric column summed into each cell.
    encoding.detaillist of column nameExtra columns shown in readouts, Table views and downloads.
    encoding.measurecolumn nameThe column that says whether a waterfall row is a step, a start or a total.
    encoding.zcolumn nameContour, surface and 3-D scatter: the numeric column drawn as iso-lines or as the third coordinate.
    encoding.setscolumn nameVenn only: the column naming the sets of each row, joined by & or a comma, such as A&B.
    encoding.anglecolumn nameVector only: the column holding each arrow’s direction in degrees, counter-clockwise from east.
    encoding.lanecolumn nameFlow only: the column naming the lane, drawn as a band, that each step sits in.
    encoding.parentcolumn nameThe column that names each row’s parent tile in a treemap.
    controlslist of mappingReader controls drawn above the chart, in author order.
    controls[n].kindone of playback, filter, metric or variantyesWhat the control changes.
    controls[n].idtextThe control’s name, unique in the chart.
    controls[n].fieldcolumn nameThe data column a playback or filter control steps through.
    controls[n].labeltextThe control’s caption.
    controls[n].optionsany valueThe choices: values, or mappings with value, label and the field, axis or chart each applies.
    controls[n].initialtext, number or true/falseThe choice shown first.
    controls[n].alltextThe label of a filter’s choice that shows every row.
    controls[n].speednumber800Milliseconds per frame of a playback control.
    controls[n].looptrue or falsetrueWhether playback starts over; false plays once.
    controls[n].asone of buttons or dropdownHow the choices are drawn.
    binningmappingHistogram bin options; other chart types refuse it.
    binning.countwhole numberSturges' ruleThe number of equal-width bins, 1 to 256.
    binning.edgeslist of numberExplicit bin edges, 2 to 257 increasing values; not combined with count or extent.
    binning.extentlist of numberThe lower and upper bound of the bins, two increasing values.
    binning.measureone of count, proportion or densitycountWhat bin heights show.
    axesmappingAxis options.
    axes.xmappingOptions of the x axis.
    axes.x.labeltextThe x axis title.
    axes.x.formatone of number, number_compact, percent or yearThe number format of x values.
    axes.x.unittextA unit printed with x values, by the unit rule.
    axes.x.digitswhole number of significant digits from 2 to 6Significant digits of x values on this axis, from 2 to 6.
    axes.x.localeone of en-US, en-GB, cs-CZ, de-DE or ja-JPThe locale of x values and calendar labels; the report’s lang otherwise.
    axes.ymappingOptions of the value axis.
    axes.y.labeltextThe value axis title.
    axes.y.formatone of number, number_compact, percent or yearThe number format of values.
    axes.y.unittextA unit printed with values, by the unit rule.
    axes.y.digitswhole number of significant digits from 2 to 6Significant digits of values on this axis, from 2 to 6.
    axes.y.minnumberThe lowest value the axis shows; below axes.y.max.
    axes.y.maxnumberThe highest value the axis shows.
    axes.y2mappingCombo charts: options of the second value axis, at the right.
    axes.y2.labeltextThe second axis title.
    axes.y2.formatone of number, number_compact, percent or yearThe number format of the second axis.
    axes.y2.unittextA unit printed with the second axis’s values.
    axes.y2.digitswhole numberSignificant digits of values on the second axis.
    axes.y2.minnumberThe lowest value the second axis shows.
    axes.y2.maxnumberThe highest value the second axis shows.
    axes.colormappingOptions of the colour scale or key.
    axes.color.labeltextThe colour key title.
    axes.color.formatone of number, number_compact, percent or yearThe number format of colour values.
    axes.color.unittextA unit printed with colour values, by the unit rule.
    axes.color.digitswhole number of significant digits from 2 to 6Significant digits of colour values on this axis, from 2 to 6.
    annotationslist of mappingMarks added on top of the data.
    annotations[n].kindone of point, range, line, band or textyesWhat the annotation draws.
    annotations[n].atmappingThe coordinate of a point, line or text annotation; required for those kinds.
    annotations[n].frommappingThe start coordinate of a range or band; required for those kinds.
    annotations[n].tomappingThe end coordinate of a range or band; required for those kinds.
    annotations[n].texttextThe annotation’s text; required for point and text annotations.
    annotations[n].rotatenumberThe rotation of a text annotation.
    stylemappingChart styling.
    style.paletteone of air, brutalist, hand-drawn, scientific or sleekThe colour palette of the marks.
    style.ratiopositive number or W:HThe width to height ratio of the chart.
    style.orientationone of auto, vertical or horizontalWhether bars and boxes stand or lie.
    style.curveone of linear, monotone, step, step_before or step_afterHow line and area marks connect points; the default is monotone.
    style.curvaturenumberHow strongly curves bend, from 0 to 1.
    style.pointsone of all, m4 or bandExplicit all draws every observation without a ceiling; m4 keeps per-pixel extrema and band dense means/ranges for line and area. When omitted, measured ceilings trigger disclosed representatives. Scatter accepts explicit all only.
    style.facet_scaleone of shared or freeWhether facet panels share one value scale (shared, the default) or each draws its own (free).
    style.gapsone of break or bridgeCombo charts: whether a missing line value breaks the line (the default) or is bridged.
    style.rangeslist of numberBullet charts: up to three ascending thresholds that shade the bands between them.
    style.bandslist of mappingGauge charts: a list of {to, label, color}, each band running from the end of the one before.
    style.minnumberGauge charts: the value at the start of the arc; axes.y.min also sets it.
    style.maxnumberGauge charts: the value at the end of the arc.
    style.cellsnumberWaffle charts: 25, 50 or 100 cells; other numbers draw 100 with a warning.
    style.innernumberPie charts: the share of the radius left open for a ring, from 0 to 0.9.
    style.azimuthnumberSurface, 3-D scatter and 3-D bar: the degrees the view turns round the vertical axis; the default is 35.
    style.elevationnumberSurface, 3-D scatter and 3-D bar: the degrees the view looks down from, from 5 to 85; the default is 28.
    style.shadetrue or falsePivot only: tint each cell along the style’s ramp by its value.
    style.bandwidthnumberThe kernel bandwidth of a density chart, in the units of x; Silverman’s rule when absent.

    Field notes:

    • encoding.x, encoding.y: Source field names for the primary axes.
    • encoding.lower, encoding.upper: Required authored numeric bounds for interval charts. Their optional encoding.y supplies an estimate.
    • encoding.color: Series/group channel; heatmaps use it for cell value.
    • encoding.size: Bubble-size field for scatter.
    • encoding.label: Optional scatter point-name field. Authored annotations take priority, then explicit highlight names, then sparse points; dense names are selected only when collision-free. Every observation remains in readouts and tables.
    • highlight: Top-level, scatter only: {by: <field>, include: [values], priority: [values]}. Rows whose by value matches an include entry are labelled first and always attempted; see the label rules below. by must name a column (checked against inline rows), include is a non-empty array of strings or numbers, and priority is an optional array that orders entries already in include. Other keys, a non-mapping value or a non-scatter chart are schema errors.
    • encoding.facet: Source field defining separate panels.
    • encoding.detail: Extra columns listed for readouts, Table views and downloads, on every type.
    • axes.x, axes.y: Optional label, format and unit strings and digits; suffix is retired for unit. axes.x.locale selects UTC calendar labels: en-US (default), en-GB, cs-CZ, de-DE, ja-JP. Day/week ticks use one compact date entry. axes.y.min and axes.y.max are optional numbers that fix the ends of the value axis (min below max).
    • axes.color: Heatmap cell value formatting: optional format, unit and digits; label names the cell value in readouts. Heatmaps have no color bar.
    • style.palette: sleek (stepped for its dark surface), air (for light surfaces), scientific, brutalist or hand-drawn. An omitted palette inherits the report treatment.
    • style.ratio: Positive width/height number or W:H string. No author pixel height.
    • style.orientation: Bars, box plots and intervals: auto (default), vertical or horizontal. Histograms accept auto or vertical.
    • style.curve: Line/area interpolation: monotone (default), linear, step, step_before or step_after; style.line.smoothing is retired (straight is linear). Monotone cubic interpolation preserves each adjacent interval’s direction and range. Steps change value halfway between observations, at the preceding coordinate, or at the next coordinate, respectively.
    • style.curvature: Finite number from 0 to 1; default 1 for monotone. Zero is straight; larger values increase the handle length without overshoot. Straight and step curves ignore this setting.

    Scatter point names follow one order. Authored annotations are placed first. Explicit highlights come next and are always attempted: matching is case-insensitive, the priority entries go first in their listed order (so the earlier entry wins a contested position), then the remaining include entries in listed order. A repeated value is placed once. A highlight sits beside its point when it can; only a highlight that cannot sit next to its point is joined to it by a leader line. When no position clears every mark, a highlight may sit over other marks on its halo but never over another label; one that cannot be placed even then is reported in droppedLabels, as is an include value that matches no plotted point (highlight matched no plotted point). Ordinary encoding.label names are sparse by default: points are ranked by isolation (fewest neighbours within 24 px first, then source order), at most 16 are attempted, and a name that collides with a placed label or would need a leader line is hidden, never drawn with a leader. Each hidden name is listed in droppedLabels with its reason (would require a leader; drop by default, no collision-free position or label density limit). A highlighted point is never labelled a second time by the ordinary pass, and highlights do not count toward its 16-name cap. Marks, readouts, Table and CSV values are unchanged by labelling. The scatter-highlights example shows a dense chart with sparse defaults and a highlighted one.

    Ordinary bars use a flat baseline and optional rounding at the value end, including negative and horizontal bars. The theme’s chart.bar-radius supplies --rv-chart-bar-radius; an absent or zero token gives square corners. The radius is capped at 15% of bar thickness and the painted length. Bars leave one zero-line stroke-width of clearance (1.5 SVG units); very small nonzero values retain one pixel of ink beyond that gap, while true zeros remain empty. Source targets and readouts retain their original values. Histogram bins keep square, area-faithful rectangles.

    Chart titles stay on the caption’s left edge, including when initial observations are zero or missing. The first x label uses the renderer’s left paint edge as its optical anchor, including visible marker outlines and exact clipping boundaries. Native HTML uses bundled font-outline estimates; settled browser charts measure the loaded first glyph’s ink separately and retain that correction in PNG downloads. Tick values, tick marks, later labels and data coordinates stay fixed. A first label keeps its original position if alignment would overlap its neighbor. Numeric/date labels and line/point category labels also stay at their original position if shifting would detach the label from its own scale coordinate, as with a leading data gap; categorical bar labels can align to their band’s leading edge but never move toward a later nonzero bar. Empty charts keep the normal caption inset.

    Default ratios are 16:9 for line/area/bar/heatmap/histogram/boxplot/interval, 4:3 for scatter and 1:1 for pie. SVG scales to the report column. Axes support the value formats number, number_compact, percent and year; a unit appends an authored unit, and a currency is a unit such as $. The year format prints the exact integer (1700, never 1.70k or 1,700) on ticks, readout headings and direct-label period text (a fractional value under an explicit year format keeps its exact source digits in readouts), and forces whole-year tick steps of at least 1 (no 2.5 step), so labels neither repeat nor sit between years. A numeric x axis uses whole-year ticks by default when every plotted x value is an integer from 1000 to 2999. An explicit non-year axes.x.format, an out-of-range value or a fractional value keeps numeric ticks; plotted values never change.

    Histograms use encoding.x as the numeric observation field and calculate the vertical measure. Each accepted row contributes one observation. Optional encoding.color stacks groups within the same interval; encoding.facet splits panels with shared edges. encoding.y, size and label are unsupported for this type. Histograms stay vertical and their measure axis starts at zero; an authored positive axes.y.max may clip heights, with a diagnostic and unchanged exact readouts.

    Histogram binning optionContract
    countInteger from 1 to 256. Equal-width intervals span the finite observed range or authored extent. Without a count, use ceil(log2(n)) + 1 (Sturges), capped at 256; a constant sample defaults to one finite interval.
    extentTwo increasing finite values. Observations outside the interval are excluded and counted.
    edgesTwo to 257 finite, strictly increasing boundaries. Cannot be combined with count or extent.
    measurecount (default), proportion (count divided by accepted visible observations in the panel), or density (proportion divided by interval width).

    Intervals include their lower boundary and exclude their upper boundary, except that the last upper boundary is included. These boundary and Sturges conventions follow the D3 binning reference; RichView uses exact equal-width edges rather than D3’s optional domain nicening. Edges that collapse to the same floating-point value are deduplicated. Automatic edges are resolved from the full eligible source before faceting or visibility changes; hiding a group changes its contribution and the visible normalization denominator, not the bins.

    Unequal widths are supported. Counts and proportions describe interval mass; use density when rectangle area should represent probability. Density integrates to one across all displayed intervals and groups in a panel with accepted data. Empty intervals remain inspectable; with no accepted observations, proportion and density read Not defined. A density outside the finite numeric range is an error with a units/count alternative. Missing/nonnumeric observations, missing group names and out-of-extent values are counted separately in diagnostics and disclosed below the chart. Bin readouts identify calculated summaries; Table and CSV retain every original source row.

    Histogram annotations use the source X field and the derived count, proportion or density coordinate, matching the selected measure. For example, at: {value: 10, count: 4} anchors a count annotation without inventing a source Y column. Measure readouts honor axes.y.format and suffix; when showing proportion or density, the separate record count and denominator remain unformatted counts. The histogram example demonstrates counts, unequal-width density and faceting.

    Box plots use type: boxplot with numeric encoding.y, optional categorical encoding.x, and optional color/facet fields. With no X field, one category contains all accepted observations. Each observed category/color pair gets a separate box; empty combinations are not invented. style.orientation accepts auto, vertical and horizontal. Auto uses the existing category-label fitting rules; explicit horizontal layouts grow with the rows. axes.x always describes categories and axes.y always describes values, including value limits, formats and suffixes, regardless of drawing orientation. Size and point-label channels are unsupported and diagnosed.

    Quartiles use R-7 linear interpolation, with positions (n - 1) * p in the sorted finite sample. The box spans Q1 to Q3 and its rule marks the median. Whiskers end at the most extreme observed values within inclusive 1.5-IQR fences; they do not end at the theoretical fences. Observations outside those fences are drawn individually and remain inspectable as potential outliers. This conventional rule does not establish that a record is an error, and the box is not a confidence interval. Singleton and repeated-value samples retain their actual zero-width numeric interval. Finite extreme and subnormal samples use overflow-safe interpolation and fence comparisons.

    Box-plot readouts label derived summaries separately from original outlier records. Long readouts scroll with the pointer or with Page Up/Page Down while the chart has keyboard focus; scrolling the readout preserves the selected observation and chart window. Missing values, nonnumeric values, missing categories and missing color groups are counted separately, with each excluded row counted once. Table and CSV retain all original rows and text. Value-axis bounds can clip visible marks; diagnostics disclose that clipping, while summaries and original source downloads keep the full accepted data. Facet panels and visible color groups are summarized independently, with stable parent colors. Annotations retain category-X/value-Y anchors in both orientations. See the box-plot example for grouped, horizontal and faceted distributions.

    Interval charts use type: interval, categorical encoding.x, numeric encoding.lower and encoding.upper, and optional encoding.y for an authored estimate. Optional color/facet fields keep group identity across sparse panels and visibility changes. Each accepted category/color pair supplies exactly one interval per panel; duplicates are errors. Bounds describe only the author’s supplied meaning. The renderer does not calculate confidence, standard error or a distribution. A missing estimate draws the range without an estimate marker; an estimate outside its own range is allowed and contributes to the automatic value domain. See the interval example.

    Lower bounds must not exceed upper bounds, including distinct decimal strings that round to the same binary64 value. True zero-width intervals remain valid. Positive intervals below that numeric precision are disclosed while readouts, Table and CSV preserve their distinct source bounds. Missing bounds, categories and color groups are counted as exclusions; original rows remain accessible. Malformed supplied numbers, nonzero underflow and missing facet names produce actionable source errors. Every facet row must name a panel so its original data can remain in that panel’s Table/CSV. Source errors identify the original row before faceting.

    Interval orientation and axis metadata follow the category-X/value-Y convention used by box plots. Readouts label lower and upper bounds separately, preserve available decimal digits and value-axis units, and show an estimate only when supplied. A geometric hit target never becomes an invented observation. Authored value limits clip ranges and estimates; endpoint caps appear only at visible authored endpoints, and clipping is disclosed. Source readouts and downloads keep the full values. Size, point-label channels and binning are unsupported. This categorical interval chart does not add continuous forecast bands or temporal transforms.

    Use style: {curve: step_after} for values held until the next observation, such as a posted price or policy rate. Step curves work on numeric, categorical and calendar axes, including areas and facets. Missing values and calendar gaps still break the path; corner vertices never become observations in tooltips, tables or CSV. Stacked areas retain straight layer boundaries.

    For a line that connects every observation without smoothing, write style: {points: all, curve: linear}. Point retention and interpolation are separate choices. With the field omitted, the default retains every valid observation up to the chart type’s declared automatic ceiling; above it, line and area use M4, while scatter keeps one representative per occupied CSS-pixel cell per series plus the x, y and size extremes. Each automatic policy always discloses its density and kept/total counts, even after a narrow zoom. Explicit points: all bypasses the ceiling and draws every point; the author or embedding host accepts the cost. Reduced paths keep every source row in readouts, Table and CSV at the author’s precision, and each actual reduction emits an informational check with the density and kept/total counts. The dense-band strategy uses per-pixel means and ranges above six observations per plot pixel for unstacked series, and per-pixel extrema otherwise; stacked areas retain extrema rather than drawing mean/range bands.

    Numeric X zoom accepts the same finite numbers and numeric strings as chart geometry. Scatter skips unusable X coordinates; numeric line and area require numeric X on every visible source row. A line or area whose X values are all calendar strings, including four-digit years, retains calendar behavior. A numeric zoom keeps its numeric scale when only year strings remain in the selected window. Hiding a nominal series can make a line or area numeric; restoring it ends numeric zoom and shows all visible categories. Distinct finite endpoints remain zoomable even if their difference exceeds the floating-point range. At the smallest representable scale, a window retains two distinct endpoints within the source extent instead of collapsing to one value. Tables and CSV keep the original values and text; selected readouts use the original source rows.

    Numeric line and area zoom selects an X viewport through their existing paths. Crossing segments remain visible between observations, while missing values still break the path. Automatic Y limits use all currently visible source rows; X zoom and pan do not rescale Y, and authored Y limits still apply. Only original observations inside the inclusive X window are available to readouts and keyboard traversal, including missing-value rows; outside path context never creates an interpolated observation. Scatter keeps point selection within the window.

    Bar and scatter facets retain the parent chart’s category colors through interaction and PNG downloads. Nonempty categories reserve their existing first-seen palette slots before value eligibility is considered; unavailable categories can reserve a slot without appearing in another panel. Monochrome bars retain the same parent hatch identity. Each panel keeps its own grouping positions, source rows, Table and CSV. Rendering a changed source derives the category slots again from that source’s order.

    When explicit chart decals are enabled, bar legend swatches show the same hatch as their bars in native reports, live views and PNG downloads. The existing six hatch shapes repeat in original category order; legend names, dimensions and controls stay unchanged.

    Pies retain labels around the disk when the complete names and percentages fit. Narrow or crowded pies use a wrapped category key and grow beyond the preferred ratio to keep both the disk and its labels readable; categories are never combined or abbreviated. Hovering or tapping a key entry inspects the same aggregated value as its slice, including tiny and zero shares. A positive share that rounds to zero is labeled <0.1%; a partial share that rounds to a whole is labeled >99.9%. Genuine zero and full shares retain 0.0% and 100.0%.

    When a style explicitly enables chart.decals, pie sectors and their category-key swatches use the existing six hatch patterns. Patterns follow the current pie category order and repeat after six categories; they are an additional cue, not unique category identifiers. Tiny sectors may show only part of a pattern. Values, proportions, labels and category order are unchanged; grayscale colors alone do not enable decals.

    Generic axis and heatmap value labels using format: percent print one percent sign when unit is also % (including surrounding whitespace). Suffix-only percentage labels remain literal source units, and other authored suffixes retain their existing text. This label rule does not change exact source readout formatting or normalize arbitrary suffix whitespace.

    Category names are never cut with an ellipsis and never silently dropped. At each width a category axis uses the first layout that fits: every name on one line; every name in a balanced wrap of at most two lines that breaks only at spaces or after a hyphen; for ordered categories (years, quarters such as 2025 Q3, months such as 2025-08 or Aug 2025, ISO days and numbered names such as Day 3), labels on every k-th period boundary (every 2, 3, 6 or 12 months, 2 or 4 quarters, 2, 5 or 10 years); and for nominal bars with style.orientation: auto, horizontal bars. Horizontal bars give every row at least 1.6 lines and grow the chart; their names sit in a gutter of at most 40% of the width and two lines, or on a line of their own above each bar when the chart is narrower than 480 px. The value axis then runs along the bottom with the axes.y.label under it, and axes.x.label heads the names. Calendar labels stay on one row and carry their year (2025-08 as Aug 25, 2025 Q3 as Q3 25 within one century; full years across centuries); tables, readouts and CSV keep the source text. A name that still has no room, which only happens on axes that cannot turn (orientation: vertical, nominal line or heatmap columns), is reported as a chart.label-dropped warning; thinned period labels are disclosed as chart.label-thinned information.

    Value axes end on labelled ticks. One value axis uses a shared magnitude, units and tick precision across its entire span; zero has no decimal padding. Direct line labels use a second value line on phones when it fits, and fall back to a legend when complete identities cannot fit. A direct label is the series name in its series colour with no dot or other mark before it; the legend fallback keeps its short line swatch (square for area and bar) as the cue that tells lines apart. A chart whose colour field has a single group draws neither a direct label nor a legend; its title carries the identity. Bars and areas keep zero, and so does any axis in percent (the percent format, a % suffix, or a label whose unit is %) when its data are all on one side of zero. A line whose values all lie on one side of zero gets up to a third of its range of room towards zero, and the axis reaches zero when that room would get there; it never crosses zero unless the data do. axes.y.min and axes.y.max override this. A parsed zero bar has no filled length and retains its source inspection target; a group without a value for a category is marked n/a at the baseline. When encoding.color names the same field as encoding.x, each category uses one bar slot with its existing category color; impossible combinations of two different values in that same field do not reserve slots or receive n/a marks. Hiding a category keeps the remaining category colors stable. Distinct X and color fields retain grouped slots even when their current values happen to match.

    Each visible bar category/series slot accepts one finite numeric observation, including numeric strings. Repeated observations reject that chart panel with chart.ambiguous-bar-slot; this includes equal values, zero and opposite signs. The diagnostic identifies each repeated category, optional series and count. Aggregate or resolve the source explicitly before drawing bars. Separate series and facets remain independent; missing or nonnumeric values do not count as a second numeric observation. Table, CSV and source inspection retain the rows. This bar rule does not change pie aggregation or repeated observations in line and area charts.

    Missing observations stay visible. Lines end with butt caps, so a break is as wide as the missing run, and lines and area fills break at the same observations. A break narrower than 3 px on screen, which a line cannot show, is marked by a 1 px rug mark (rvc-gap) standing on the plot’s bottom edge; marks closer than 2 px merge into one short bar. The native gap diagnostic counts those narrow breaks at the rendered width.

    Heatmaps show an authored missing color value as a neutral outlined cell with n/a where the cell has room for readable text. Null, an absent color field, blank text and the case-insensitive markers ., na, n/a, nan, null and none mean no observation; an absent row/column combination stays empty. The cell title and readout retain source identity, while Table and CSV retain the original values. Arbitrary nonnumeric text is an error and is not painted. A missing row that repeats an existing coordinate is diagnosed and is not drawn over another observation; resolve those source rows explicitly. Missing cells do not enter the numeric color domain. A heatmap with no numeric observations retains its source error and has no numeric key.

    Heatmap cell labels use three-significant-digit scientific notation when their compact text would round a nonzero value to 0. Actual zero and existing nonzero compact strings keep their formatting. Percentage conversion and literal suffixes apply as before. A longer label appears only when it fits the existing cell and clears authored annotation text or strokes; cell geometry, color, exact readouts, Table and CSV remain unchanged.

    Two or more numeric observations at the same heatmap coordinate reject that panel with an explanation and source diagnostics; row order never chooses the visible value. Aggregate or resolve those source rows explicitly. Diagnostics identify the original one-based rows of the affected chart’s resolved data, including each facet’s own Table. All source rows remain available in Table and CSV, and valid neighboring facets still draw.

    Only finite heatmap values with nonempty X and Y coordinates enter the color domain. A numeric observation with an absent, null or empty coordinate reports an error and stays available in source interfaces; its invisible value does not alter visible cell colors. The diagnostic names the encoded coordinate fields and counts affected observations, with separate X/Y counts that can overlap. Numeric zero, boolean false, significant whitespace and literal category names remain valid coordinates. If no numeric values can be placed, there is no numeric key; located missing cells keep their outlines, and a chart with no placeable cells explains the coordinate problem. Existing source-derived row and column names remain unchanged.

    Line and area charts whose X values all select calendar handling retain calendar validation. Invalid data, including repeated timestamps within one series, displays Cannot draw this time series with its original diagnostics instead of falling back to categorical drawing. Source Table and CSV values remain available; valid neighboring facets still draw. A facet field with no actual groups does not disable calendar handling. Live generic chart measurements retain source errors alongside browser glyph checks, and valid updates clear previous errors.

    Series controls use the same category names as their marks, including numeric and boolean categories; numeric 1 and string "1" share one group without rewriting source rows. Multi-series generic plots retain their controls when all groups are hidden, so every group can be restored. A sole group has no legend control and stays visible. Updating a generic chart retains hidden groups still present in the new source and restores all current groups if none would otherwise remain visible.

    Heatmap rows are at least 1.6 lines tall and the chart grows with them. Row names wrap to two lines in a gutter of at most 35% of the width; column names wrap to two lines, and the grid transposes when that lets every column be named. Cells are coloured by magnitude on the theme’s three-stop chart.ramp, mixed in OKLCH: zero is the ramp’s low stop and the rounded maximum magnitude its high stop. Negative values take a second arm with the same lightness steps and the hue turned by 150° (blue ramps meet orange), so salience follows magnitude and hue shows the sign. The color domain includes zero and the data and rounds outwards to a shared maximum magnitude; no color bar is drawn. Cells at least 40 × 20 px print their value. Values at the author’s chosen precision remain available in readouts and tables. Where CSS contrast-color() is supported, numeric cell text chooses black or white from that cell’s color expression, including live ramp-variable changes. Other viewers retain the existing theme ink/surface fallback. The rule travels inside standalone SVGs; authored !important text fills still take precedence. This does not change cell colors, value formatting or label fit, and does not promise a contrast threshold for arbitrary overrides or viewers.

    Each builtin theme has a categorical palette, authored as oklch() inside sRGB and validated on that theme’s chart surface: the first four colours reach 3:1 against it, and neighbouring colours differ by an OKLab ΔE×100 of at least 15 for normal vision and at least 8 under protan, deutan and tritan simulation (Machado, Oliveira and Fernandes, 2009). A style’s chart.palette (a builtin palette name, or one to eight colours) and chart.ramp (exactly three colours, low to high) set them; each theme’s ramp is authored in OKLCH and its lightness moves steadily away from the surface, so salience rises with value. Sequential encodings use the ramp, never the categorical palette. Short palettes repeat through the eight series slots. The accent is first except in hand-drawn, whose six grays repeat and whose red pencil is reserved for the stat underline.

    With encoding.size, scatter bubble areas are proportional to finite nonnegative values; the largest plotted positive size has a 16 px radius. Zero has no filled area and remains available through keyboard and author-precision readouts. Missing, negative or nonnumeric sizes omit the bubble and produce diagnostics; their original rows remain available in the table and CSV. Plots with no positive bubble sizes include an explanatory note. Without encoding.size, scatter points have a fixed 4 px radius.

    Sized scatter plots with a positive size include an outlined reference circle with a 16 px radius below the axes, labelled with the complete size field and the finite value, at the author’s precision, used by that panel’s area scale. The guide follows the currently rendered rows and each facet’s existing local scale. It does not represent an additional observation or inspection target. It appends height without moving the plot; an explicit render height can grow with a fixed-height diagnostic. Tiny or long scale numbers use scientific notation when necessary to retain their value.

    For one-signed percentage scatters without authored Y bounds or annotations, the axis ends at zero when every drawn point or bubble still has 4 px of space beyond its radius at both Y edges. Values at or near zero retain the padding they need. Trimming unused space preserves the opposite endpoint, tick values, bubble areas and a linear value scale.

    Percentage axes multiply fractional values by 100 and share the precision required by their tick step, up to eight decimal places. Nonzero percentages retain at least one decimal; zero is printed as 0%. An authored % suffix appends the unit without scaling values.

    Numeric axes and the heatmap key use scientific notation when the existing numeric body exceeds 12 characters, a nonzero scale would round to zero, or its tick step cannot be expressed at eight decimal places. Coefficient precision follows the existing step, up to 17 significant digits. Explicit display units and percentage conversion still apply once; automatic k/M/B suffixes are omitted in scientific notation. Exact source readouts and compact cell/end-value labels keep their separate formatting policies. Shorter labels can change the existing automatic tick layout and plot gutter; source values and authored bounds remain unchanged.

    AnnotationAnchor fieldsText
    pointat coordinate mappingRequired.
    rangefrom, to coordinate mappingsOptional.
    lineat coordinate mappingOptional.
    bandfrom, to coordinate mappingsOptional.
    textat coordinate mapping; optional numeric rotateRequired.

    Anchor coordinates are strings or numbers. Cartesian annotations use axis/source fields; pie points identify a named slice, and heatmap points identify a cell. Unsupported coordinates remain diagnosable rather than inventing observations. Labels search around their exact anchors with clearance from marks and already-placed glyph boxes; placement never moves an observation. If no clear position exists, optional text is omitted with a dropped-label reason. Browser checks measure actual glyph rectangles after fonts settle.

    Numeric text below the representable nonzero range reports a source error instead of silently becoming zero. This applies to numeric coordinates, measures and scatter sizes, including CSV sources; category labels and unused metadata retain their text. The affected facet explains the error and retains its source Table/CSV while other panels remain usable. True zero and representable subnormal values remain valid. Explicit table number formats retain unrepresentable text verbatim. JSON/YAML numeric literals already converted by their parser cannot recover lost decimal spelling; use quoted numeric text when exact source representation matters.

    Calendar and numeric line/area charts share the same geometry engine and point-retention policy. Calendar x changes the axis and gap rules. Layout uses the source values; readers receive values at the author’s precision and bounded position grids, including when every observation is drawn. Already rounded JSON numbers cannot recover their original decimal spelling.

    Bar, scatter, pie and non-temporal line/area readouts honor numeric axis unit and percentage formats at the author’s precision (three significant digits by default, digits per chart or column); no measured value reaches the HTML at more precision than the author chose; a position decodes to no more digits than the larger of the author’s precision and 1/4,096 of the axis, and a zoom stops where one grid step spans about two pixels; dates keep their source resolution, and integer scales with fewer than 4,096 intervals use unit steps; category names, identifiers and other text the author wrote travel as written. Heatmap measures use axes.color labels, formats and suffixes, while coordinate names retain their nominal role; a color field reused as a coordinate keeps that coordinate’s existing readout. Percentage format converts fractions to percentages; a literal % suffix alone does not rescale values. Missing measures read No observation, and invalid text remains verbatim. Table and CSV values carry the same author-precision values the readouts show. Source tables include fields introduced by later rows, even beyond the first page. CSV downloads encode arrays and objects as quoted JSON cells so embedded commas and quotes cannot shift columns. Temporal readouts use the time-series engine’s separate formatting policy.

    Was this page useful? Suggest an edit