Graflume · Alpha
Distribution · Extreme-environment application
Compare raw samples through univariate or bivariate density, summary statistics, and theoretical curves. Combine container size, input method, display capability, and user preference instead of guessing a device name. Compare mobile, watch, e-paper, monochrome, dot-matrix, and standards-based extreme environments on the same chart.
Chart family · Default families
Distribution
Compare raw samples through univariate or bivariate density, summary statistics, and theoretical curves.
- Quick API
distribution()- Browser snapshot
graflume- mark
distribution- Presets
- 10
Extreme environments
Reconfigure for display, input, and device capability
Combine container size, input method, display capability, and user preference instead of guessing a device name. Compare mobile, watch, e-paper, monochrome, dot-matrix, and standards-based extreme environments on the same chart.
Fluid responsive
Reflow axes, legends, descriptions, and controls from the available container size.
960×540 · adaptive.profiles=responsive-fluidzoom-reflowshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Mobile
Prioritize 44px touch targets, tap tooltips, and collapsed secondary information on a narrow portrait screen.
390×844 · adaptive.profiles=mobile-touchzoom-reflowcoarse-touchvirtual-keyboardshape-rectangledisplay-colorinput-coarsemotion-fullrenderer-canvas-spatial
Smartwatch
Keep essential marks, values, and stepped controls on a tiny or round screen, with the remaining detail reflowed below.
184×224 · adaptive.profiles=smartwatchzoom-reflowreduced-effectscoarse-touchlow-resourcecutout-roundshape-rounddisplay-colorinput-coarsemotion-reducedrenderer-canvas-spatialviewport-tiny
E-book and e-paper
Prefer stable frames, strong contrast, and the data table for low-refresh e-paper displays.
758×1024 · adaptive.profiles=ebook-paperprint-pagedreduced-effectslow-resourceshape-pageddisplay-e-inkinput-keyboardmotion-staticrenderer-canvas-spatial
Monochrome
Use strokes, markers, patterns, labels, and the table so color is never the only distinction.
640×400 · adaptive.profiles=monochromereduced-effectsshape-rectangledisplay-monochromeinput-finemotion-reducedrenderer-canvas-spatial
Dot-matrix display
Reduce decoration and mark density while using strong strokes, integer labels, and stepped zoom on a low-resolution display.
320×240 · adaptive.profiles=dot-matrixzoom-reflowreduced-effectskeyboard-switchlow-resourceshape-rectangledisplay-gridinput-keyboardmotion-staticrenderer-canvas-spatialviewport-tiny
400% zoom and reflow
Reflow prose to one dimension at the 320 CSS px equivalent while retaining chart-local zoom and pan.
320×480 · adaptive.profiles=zoom-reflowzoom-reflowshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Foldable dual screen
Keep the chart and explanation in independent viewport segments without crossing the hinge.
720×640 · adaptive.profiles=foldable-dualfoldable-dualshape-dualdisplay-colorinput-finemotion-fullrenderer-canvas-spatial
TV and remote
Provide strong focus indication and D-pad, Enter, and Escape operation on a hoverless distance display.
1920×1080 · adaptive.profiles=tv-remotetv-remoteshape-rectangledisplay-colorinput-remotemotion-fullrenderer-canvas-spatial
Print and paged media
Pair a static chart with its description and table, hide controls, and avoid page breaks through the figure.
794×1123 · adaptive.profiles=print-pagedprint-pagedshape-pageddisplay-colorinput-finemotion-staticrenderer-canvas-spatial
Forced colors
Honor system colors and borders while retaining patterns, markers, and text as redundant cues.
640×400 · adaptive.profiles=forced-colorsforced-colorsshape-rectangledisplay-high-contrastinput-finemotion-fullrenderer-canvas-spatial
Reduced effects
Complete transitions immediately and use opaque surfaces and deferred work to reduce motion and transparency load.
640×400 · adaptive.profiles=reduced-effectsreduced-effectsshape-rectangledisplay-colorinput-finemotion-reducedrenderer-canvas-spatial
Coarse touch
Inspect values by tap without hover, keep targets at least 44px, and expose explicit zoom buttons.
390×844 · adaptive.profiles=coarse-touchcoarse-touchshape-rectangledisplay-colorinput-coarsemotion-fullrenderer-canvas-spatial
Keyboard and switch input
Reach every operation with Tab, arrows, Enter, Space, and Escape, with no drag-only action.
640×400 · adaptive.profiles=keyboard-switchkeyboard-switchshape-rectangledisplay-colorinput-keyboardmotion-fullrenderer-canvas-spatial
Low resource and slow network
Prefer progressive rendering, sampling, cancellable work, and a static fallback under constrained memory or connectivity.
640×400 · adaptive.profiles=low-resourcelow-resourceshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
RTL document
Follow RTL logical flow for prose and tabs while keeping axes, code, and data identifiers in technical LTR order.
640×400 · adaptive.profiles=rtlrtlshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Vertical writing
Reflow vertical prose while keeping the chart and technical surfaces in an independent horizontal panel.
640×400 · adaptive.profiles=vertical-writingvertical-writingshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Ultrawide and projection
Cap chart width instead of stretching indefinitely, using panelization and readable labels on ultrawide or projected surfaces.
1920×720 · adaptive.profiles=ultrawide-projectionultrawide-projectionshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Screen reader and braille
Provide short and long descriptions, a semantic table, and status so Canvas or color is never the sole information path.
640×400 · adaptive.profiles=screenreader-braillescreenreader-brailleshape-nonvisualdisplay-colorinput-nonvisualmotion-fullrenderer-canvas-spatial
No scripting
A verified static preview, description, and collapsible row-data table preserve the essential information when scripting is unavailable.
640×400 · adaptive.profiles=no-scriptno-scriptshape-nonvisualdisplay-colorinput-finemotion-staticrenderer-static-fallback
XR and see-through display
Fall back safely to the ordinary 2D or WebGL panel when XR APIs are absent, duplicating depth cues in text and the table.
640×400 · adaptive.profiles=spatial-xrspatial-xrshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Cutout and round display
Inset titles, marks, and controls around safe areas and round display bounds so they are not clipped.
184×224 · adaptive.profiles=cutout-roundcutout-roundshape-rounddisplay-colorinput-finemotion-fullrenderer-canvas-spatialviewport-tiny
Virtual keyboard viewport
Reflow focus controls, the chart, and the active explanation when a virtual keyboard reduces the visual viewport.
390×560 · adaptive.profiles=virtual-keyboardvirtual-keyboardshape-rectangledisplay-colorinput-finemotion-fullrenderer-canvas-spatial
Extreme environment preview
Choose a profile above to preserve the same data and ChartSpec while reconfiguring the chart for display size, input method, display capability, and user preference.
StatusLoading
adaptivecapability-drivenno-user-agent-branching
- Legend:
legend · categories · series - Point and range highlights:
highlights[] · datum · value - Custom callouts:
annotations[] · datum · value · callout · placement:auto - Interactive selection:
selection · multiple · toggle
Loading
Extreme environment preview · Row data
Row data and zero-copy TypedArray columns share one data contract.
valuequantitative | seriesordinal |
|---|---|
| 44.8 | Before launch |
| 48.609 | Before launch |
| 51.351 | Before launch |
| 52.38 | Before launch |
| 51.584 | Before launch |
| 49.421 | Before launch |
| 46.777 | Before launch |
| 38.377 | Before launch |
| 37.656 | Before launch |
| 38.692 | Before launch |
| 41.286 | Before launch |
| 44.733 | Before launch |
| 48.059 | Before launch |
| 50.344 | Before launch |
| 44.729 | Before launch |
| 43.798 | Before launch |
| 41.794 | Before launch |
| 39.634 | Before launch |
| 38.32 | Before launch |
| 38.603 | Before launch |
| 40.742 | Before launch |
| 38.114 | Before launch |
| 42.518 | Before launch |
| 46.633 | Before launch |
| 49.548 | Before launch |
| 50.754 | Before launch |
| 50.304 | Before launch |
| 48.795 | Before launch |
| 40.859 | Before launch |
| 40.062 | Before launch |
| 40.777 | Before launch |
| 43.161 | Before launch |
| 46.801 | Before launch |
| 50.846 | Before launch |
| 54.285 | Before launch |
| 49.975 | Before launch |
| 55.8 | After launch |
| 59.609 | After launch |
| 62.351 | After launch |
| 63.38 | After launch |
| 62.584 | After launch |
| 60.421 | After launch |
| 57.777 | After launch |
| 49.377 | After launch |
| 48.656 | After launch |
| 49.692 | After launch |
| 52.286 | After launch |
| 55.733 | After launch |
| 59.059 | After launch |
| 61.344 | After launch |
| 55.729 | After launch |
| 54.798 | After launch |
| 52.794 | After launch |
| 50.634 | After launch |
| 49.32 | After launch |
| 49.603 | After launch |
| 51.742 | After launch |
| 49.114 | After launch |
| 53.518 | After launch |
| 57.633 | After launch |
| 60.548 | After launch |
| 61.754 | After launch |
| 61.304 | After launch |
| 59.795 | After launch |
| 51.859 | After launch |
| 51.062 | After launch |
| 51.777 | After launch |
| 54.161 | After launch |
| 57.801 | After launch |
| 61.846 | After launch |
| 65.285 | After launch |
| 60.975 | After launch |
Browser API · Portable schema
Browser API
Graflume.distribution()
const data = [
{
"sample": "Seoul · baseline · W1",
"series": "Before launch",
"value": 44.8,
"weight": 1
},
{
"sample": "Tokyo · baseline · W1",
"series": "Before launch",
"value": 48.609,
"weight": 1.25
},
{
"sample": "Singapore · baseline · W1",
"series": "Before launch",
"value": 51.351,
"weight": 1.5
},
{
"sample": "Paris · baseline · W1",
"series": "Before launch",
"value": 52.38,
"weight": 1.75
},
{
"sample": "New York · baseline · W1",
"series": "Before launch",
"value": 51.584,
"weight": 1
},
{
"sample": "Sydney · baseline · W1",
"series": "Before launch",
"value": 49.421,
"weight": 1.25
},
{
"sample": "Seoul · baseline · W2",
"series": "Before launch",
"value": 46.777,
"weight": 1.5
},
{
"sample": "Tokyo · baseline · W2",
"series": "Before launch",
"value": 38.377,
"weight": 1.75
},
{
"sample": "Singapore · baseline · W2",
"series": "Before launch",
"value": 37.656,
"weight": 1
},
{
"sample": "Paris · baseline · W2",
"series": "Before launch",
"value": 38.692,
"weight": 1.25
},
{
"sample": "New York · baseline · W2",
"series": "Before launch",
"value": 41.286,
"weight": 1.5
},
{
"sample": "Sydney · baseline · W2",
"series": "Before launch",
"value": 44.733,
"weight": 1.75
},
{
"sample": "Seoul · baseline · W3",
"series": "Before launch",
"value": 48.059,
"weight": 1
},
{
"sample": "Tokyo · baseline · W3",
"series": "Before launch",
"value": 50.344,
"weight": 1.25
},
{
"sample": "Singapore · baseline · W3",
"series": "Before launch",
"value": 44.729,
"weight": 1.5
},
{
"sample": "Paris · baseline · W3",
"series": "Before launch",
"value": 43.798,
"weight": 1.75
},
{
"sample": "New York · baseline · W3",
"series": "Before launch",
"value": 41.794,
"weight": 1
},
{
"sample": "Sydney · baseline · W3",
"series": "Before launch",
"value": 39.634,
"weight": 1.25
},
{
"sample": "Seoul · baseline · W4",
"series": "Before launch",
"value": 38.32,
"weight": 1.5
},
{
"sample": "Tokyo · baseline · W4",
"series": "Before launch",
"value": 38.603,
"weight": 1.75
},
{
"sample": "Singapore · baseline · W4",
"series": "Before launch",
"value": 40.742,
"weight": 1
},
{
"sample": "Paris · baseline · W4",
"series": "Before launch",
"value": 38.114,
"weight": 1.25
},
{
"sample": "New York · baseline · W4",
"series": "Before launch",
"value": 42.518,
"weight": 1.5
},
{
"sample": "Sydney · baseline · W4",
"series": "Before launch",
"value": 46.633,
"weight": 1.75
},
{
"sample": "Seoul · baseline · W5",
"series": "Before launch",
"value": 49.548,
"weight": 1
},
{
"sample": "Tokyo · baseline · W5",
"series": "Before launch",
"value": 50.754,
"weight": 1.25
},
{
"sample": "Singapore · baseline · W5",
"series": "Before launch",
"value": 50.304,
"weight": 1.5
},
{
"sample": "Paris · baseline · W5",
"series": "Before launch",
"value": 48.795,
"weight": 1.75
},
{
"sample": "New York · baseline · W5",
"series": "Before launch",
"value": 40.859,
"weight": 1
},
{
"sample": "Sydney · baseline · W5",
"series": "Before launch",
"value": 40.062,
"weight": 1.25
},
{
"sample": "Seoul · baseline · W6",
"series": "Before launch",
"value": 40.777,
"weight": 1.5
},
{
"sample": "Tokyo · baseline · W6",
"series": "Before launch",
"value": 43.161,
"weight": 1.75
},
{
"sample": "Singapore · baseline · W6",
"series": "Before launch",
"value": 46.801,
"weight": 1
},
{
"sample": "Paris · baseline · W6",
"series": "Before launch",
"value": 50.846,
"weight": 1.25
},
{
"sample": "New York · baseline · W6",
"series": "Before launch",
"value": 54.285,
"weight": 1.5
},
{
"sample": "Sydney · baseline · W6",
"series": "Before launch",
"value": 49.975,
"weight": 1.75
},
{
"sample": "Seoul · post-launch · W1",
"series": "After launch",
"value": 55.8,
"weight": 1
},
{
"sample": "Tokyo · post-launch · W1",
"series": "After launch",
"value": 59.609,
"weight": 1.25
},
{
"sample": "Singapore · post-launch · W1",
"series": "After launch",
"value": 62.351,
"weight": 1.5
},
{
"sample": "Paris · post-launch · W1",
"series": "After launch",
"value": 63.38,
"weight": 1.75
},
{
"sample": "New York · post-launch · W1",
"series": "After launch",
"value": 62.584,
"weight": 1
},
{
"sample": "Sydney · post-launch · W1",
"series": "After launch",
"value": 60.421,
"weight": 1.25
},
{
"sample": "Seoul · post-launch · W2",
"series": "After launch",
"value": 57.777,
"weight": 1.5
},
{
"sample": "Tokyo · post-launch · W2",
"series": "After launch",
"value": 49.377,
"weight": 1.75
},
{
"sample": "Singapore · post-launch · W2",
"series": "After launch",
"value": 48.656,
"weight": 1
},
{
"sample": "Paris · post-launch · W2",
"series": "After launch",
"value": 49.692,
"weight": 1.25
},
{
"sample": "New York · post-launch · W2",
"series": "After launch",
"value": 52.286,
"weight": 1.5
},
{
"sample": "Sydney · post-launch · W2",
"series": "After launch",
"value": 55.733,
"weight": 1.75
},
{
"sample": "Seoul · post-launch · W3",
"series": "After launch",
"value": 59.059,
"weight": 1
},
{
"sample": "Tokyo · post-launch · W3",
"series": "After launch",
"value": 61.344,
"weight": 1.25
},
{
"sample": "Singapore · post-launch · W3",
"series": "After launch",
"value": 55.729,
"weight": 1.5
},
{
"sample": "Paris · post-launch · W3",
"series": "After launch",
"value": 54.798,
"weight": 1.75
},
{
"sample": "New York · post-launch · W3",
"series": "After launch",
"value": 52.794,
"weight": 1
},
{
"sample": "Sydney · post-launch · W3",
"series": "After launch",
"value": 50.634,
"weight": 1.25
},
{
"sample": "Seoul · post-launch · W4",
"series": "After launch",
"value": 49.32,
"weight": 1.5
},
{
"sample": "Tokyo · post-launch · W4",
"series": "After launch",
"value": 49.603,
"weight": 1.75
},
{
"sample": "Singapore · post-launch · W4",
"series": "After launch",
"value": 51.742,
"weight": 1
},
{
"sample": "Paris · post-launch · W4",
"series": "After launch",
"value": 49.114,
"weight": 1.25
},
{
"sample": "New York · post-launch · W4",
"series": "After launch",
"value": 53.518,
"weight": 1.5
},
{
"sample": "Sydney · post-launch · W4",
"series": "After launch",
"value": 57.633,
"weight": 1.75
},
{
"sample": "Seoul · post-launch · W5",
"series": "After launch",
"value": 60.548,
"weight": 1
},
{
"sample": "Tokyo · post-launch · W5",
"series": "After launch",
"value": 61.754,
"weight": 1.25
},
{
"sample": "Singapore · post-launch · W5",
"series": "After launch",
"value": 61.304,
"weight": 1.5
},
{
"sample": "Paris · post-launch · W5",
"series": "After launch",
"value": 59.795,
"weight": 1.75
},
{
"sample": "New York · post-launch · W5",
"series": "After launch",
"value": 51.859,
"weight": 1
},
{
"sample": "Sydney · post-launch · W5",
"series": "After launch",
"value": 51.062,
"weight": 1.25
},
{
"sample": "Seoul · post-launch · W6",
"series": "After launch",
"value": 51.777,
"weight": 1.5
},
{
"sample": "Tokyo · post-launch · W6",
"series": "After launch",
"value": 54.161,
"weight": 1.75
},
{
"sample": "Singapore · post-launch · W6",
"series": "After launch",
"value": 57.801,
"weight": 1
},
{
"sample": "Paris · post-launch · W6",
"series": "After launch",
"value": 61.846,
"weight": 1.25
},
{
"sample": "New York · post-launch · W6",
"series": "After launch",
"value": 65.285,
"weight": 1.5
},
{
"sample": "Sydney · post-launch · W6",
"series": "After launch",
"value": 60.975,
"weight": 1.75
}
];
const options = {
"accessibility": {
"description": "Before-and-after cohorts reveal the shift, spread, and remaining overlap. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Distribution chart: Before-and-after cohorts reveal the shift, spread, and remaining overlap"
},
"annotations": [
{
"connector": {
"visible": true
},
"detail": "Attach user-authored safe text to a datum, axis range, or normalized plot position.",
"id": "manual-callout",
"placement": "auto",
"style": {
"maxWidth": 220,
"padding": 8
},
"target": {
"field": "value",
"type": "datum",
"value": 55.8
},
"text": "Point and range highlights · 55.8"
}
],
"axes": {
"x": {
"format": {
"type": "integer"
},
"ticks": {
"spacing": 8,
"values": [
18,
24,
30,
36,
39
]
}
},
"y": {
"format": {
"type": "integer"
},
"ticks": {
"count": 5,
"spacing": 8
}
}
},
"create": {
"adaptive": {
"profiles": "auto"
}
},
"height": 620,
"highlights": [
{
"id": "manual-focus",
"padding": 7,
"target": {
"field": "value",
"type": "datum",
"value": 55.8
}
}
],
"interaction": {
"controls": {
"annotations": true,
"export": true,
"fullscreen": true,
"labels": {
"controls": "Chart controls",
"enterFullscreen": "Enter fullscreen",
"exitFullscreen": "Exit fullscreen",
"exportPng": "Download PNG",
"hideAnnotations": "Hide callouts",
"loop": "Loop playback",
"nextFrame": "Next frame",
"pause": "Pause",
"play": "Play",
"previousFrame": "Previous frame",
"reset": "Reset view",
"seek": "Playback position",
"showAnnotations": "Show callouts",
"speed": "Playback speed",
"zoomIn": "Zoom in",
"zoomOut": "Zoom out"
},
"playback": false,
"reset": true,
"zoom": true
},
"hover": true,
"navigation": {
"drag": true,
"keyboard": true,
"maxZoom": 6,
"minZoom": 1,
"pinch": true,
"wheel": "modifier"
},
"selection": {
"ariaLabel": "Interactive selection",
"clearOnBackground": true,
"clearOnEscape": true,
"highlight": {
"padding": 5
},
"key": "value",
"mode": "multiple",
"toggle": true
},
"tooltip": {
"axis": "x",
"fields": [
{
"field": "binStart",
"format": "number",
"label": "Bin start"
},
{
"field": "binEnd",
"format": "number",
"label": "Bin end"
},
{
"field": "count",
"format": "integer",
"label": "Count"
},
{
"field": "proportion",
"format": "percent",
"fractionDigits": 1,
"label": "Proportion"
}
],
"title": "Distribution",
"trigger": "axis"
}
},
"legend": {
"field": "series",
"interactive": false,
"labels": {
"hide": "Hide",
"show": "Show"
},
"maxItems": 8,
"mode": "categories",
"orientation": "horizontal",
"position": "bottom",
"title": "Series",
"visible": true
},
"locale": "en",
"mark": {
"fields": {
"group": "series",
"value": "value"
},
"options": {
"mode": "histogram"
}
},
"padding": {
"top": 52
},
"theme": "graflume-light",
"title": {
"subtitle": "Before-and-after cohorts reveal the shift, spread, and remaining overlap",
"text": "Distribution chart"
},
"width": "container",
"x": {
"field": "value",
"title": "Outcome score",
"type": "quantitative"
},
"y": {
"field": "value",
"title": "Frequency",
"type": "quantitative"
}
};
Graflume.distribution('#chart', data, options);Portable schema
ChartSpec 0.1 · options
{
"accessibility": {
"description": "Before-and-after cohorts reveal the shift, spread, and remaining overlap. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Distribution chart: Before-and-after cohorts reveal the shift, spread, and remaining overlap"
},
"annotations": [
{
"connector": {
"visible": true
},
"detail": "Attach user-authored safe text to a datum, axis range, or normalized plot position.",
"id": "manual-callout",
"placement": "auto",
"style": {
"maxWidth": 220,
"padding": 8
},
"target": {
"field": "value",
"type": "datum",
"value": 55.8
},
"text": "Point and range highlights · 55.8"
}
],
"axes": {
"x": {
"format": {
"type": "integer"
},
"ticks": {
"spacing": 8,
"values": [
18,
24,
30,
36,
39
]
}
},
"y": {
"format": {
"type": "integer"
},
"ticks": {
"count": 5,
"spacing": 8
}
}
},
"create": {
"adaptive": {
"profiles": "auto"
}
},
"height": 620,
"highlights": [
{
"id": "manual-focus",
"padding": 7,
"target": {
"field": "value",
"type": "datum",
"value": 55.8
}
}
],
"interaction": {
"controls": {
"annotations": true,
"export": true,
"fullscreen": true,
"labels": {
"controls": "Chart controls",
"enterFullscreen": "Enter fullscreen",
"exitFullscreen": "Exit fullscreen",
"exportPng": "Download PNG",
"hideAnnotations": "Hide callouts",
"loop": "Loop playback",
"nextFrame": "Next frame",
"pause": "Pause",
"play": "Play",
"previousFrame": "Previous frame",
"reset": "Reset view",
"seek": "Playback position",
"showAnnotations": "Show callouts",
"speed": "Playback speed",
"zoomIn": "Zoom in",
"zoomOut": "Zoom out"
},
"playback": false,
"reset": true,
"zoom": true
},
"hover": true,
"navigation": {
"drag": true,
"keyboard": true,
"maxZoom": 6,
"minZoom": 1,
"pinch": true,
"wheel": "modifier"
},
"selection": {
"ariaLabel": "Interactive selection",
"clearOnBackground": true,
"clearOnEscape": true,
"highlight": {
"padding": 5
},
"key": "value",
"mode": "multiple",
"toggle": true
},
"tooltip": {
"axis": "x",
"fields": [
{
"field": "binStart",
"format": "number",
"label": "Bin start"
},
{
"field": "binEnd",
"format": "number",
"label": "Bin end"
},
{
"field": "count",
"format": "integer",
"label": "Count"
},
{
"field": "proportion",
"format": "percent",
"fractionDigits": 1,
"label": "Proportion"
}
],
"title": "Distribution",
"trigger": "axis"
}
},
"legend": {
"field": "series",
"interactive": false,
"labels": {
"hide": "Hide",
"show": "Show"
},
"maxItems": 8,
"mode": "categories",
"orientation": "horizontal",
"position": "bottom",
"title": "Series",
"visible": true
},
"locale": "en",
"mark": {
"fields": {
"group": "series",
"value": "value"
},
"options": {
"mode": "histogram"
}
},
"padding": {
"top": 52
},
"theme": "graflume-light",
"title": {
"subtitle": "Before-and-after cohorts reveal the shift, spread, and remaining overlap",
"text": "Distribution chart"
},
"width": "container",
"x": {
"field": "value",
"title": "Outcome score",
"type": "quantitative"
},
"y": {
"field": "value",
"title": "Frequency",
"type": "quantitative"
}
}