Graflume · Alpha
Vector field · Extreme-environment application
Encode direction and magnitude at each coordinate with arrow angle and length. 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 · Specialized families
Vector field
Encode direction and magnitude at each coordinate with arrow angle and length.
- Quick API
vectorField()- Browser snapshot
graflume/complete- mark
vector- Presets
- 2
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 · explicit · 1 channels - Point and range highlights:
highlights[] · datum · direction - Custom callouts:
annotations[] · datum · direction · 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.
xquantitative | yquantitative | directionquantitative | magnitudequantitative |
|---|---|---|---|
| -4 | -3 | 310.267 | 2.228 |
| -3 | -3 | 322.357 | 1.998 |
| -2 | -3 | 335.932 | 1.815 |
| -1 | -3 | 350.937 | 1.651 |
| 0 | -3 | 8.269000000000005 | 1.53 |
| 1 | -3 | 27.187000000000012 | 1.532 |
| 2 | -3 | 43.389999999999986 | 1.718 |
| 3 | -3 | 53.60000000000002 | 2.062 |
| 4 | -3 | 58.69999999999999 | 2.504 |
| -4 | -2 | 298.909 | 1.986 |
| -3 | -2 | 311.202 | 1.673 |
| -2 | -2 | 326.516 | 1.411 |
| -1 | -2 | 345.451 | 1.188 |
| 0 | -2 | 9.963000000000022 | 1.05 |
| 1 | -2 | 36.84699999999998 | 1.103 |
| 2 | -2 | 56.06 | 1.376 |
| 3 | -2 | 65.358 | 1.784 |
| 4 | -2 | 68.65899999999999 | 2.256 |
| -4 | -1 | 284.619 | 1.902 |
| -3 | -1 | 294.563 | 1.496 |
| -2 | -1 | 308.364 | 1.123 |
| -1 | -1 | 329.141 | 0.78 |
| 0 | -1 | 8.192999999999984 | 0.559 |
| 1 | -1 | 54.25799999999998 | 0.69 |
| 2 | -1 | 74.50400000000002 | 1.079 |
| 3 | -1 | 80.14999999999998 | 1.542 |
| 4 | -1 | 80.31900000000002 | 2.029 |
| -4 | 0 | 270 | 1.97 |
| -3 | 0 | 275.434 | 1.497 |
| -2 | 0 | 282.115 | 1.033 |
| -1 | 0 | 289.714 | 0.563 |
| 0 | 0 | 325.853 | 0.089 |
| 1 | 0 | 100.17399999999998 | 0.437 |
| 2 | 0 | 101.899 | 0.93 |
| 3 | 0 | 98.83800000000002 | 1.407 |
| 4 | 0 | 94.24700000000001 | 1.875 |
| -4 | 1 | 257.019 | 2.137 |
| -3 | 1 | 258.078 | 1.638 |
| -2 | 1 | 256.801 | 1.153 |
| -1 | 1 | 245.691 | 0.705 |
| 0 | 1 | 201.766 | 0.437 |
| 1 | 1 | 150.30200000000002 | 0.641 |
| 2 | 1 | 130.098 | 1.043 |
| 3 | 1 | 118.582 | 1.455 |
| 4 | 1 | 109.39600000000002 | 1.864 |
| -4 | 2 | 245.817 | 2.343 |
| -3 | 2 | 243.73 | 1.849 |
| -2 | 2 | 237.748 | 1.393 |
| -1 | 2 | 222.18 | 1.039 |
| 0 | 2 | 193.806 | 0.913 |
| 1 | 2 | 165.813 | 1.07 |
| 2 | 2 | 147.202 | 1.37 |
| 3 | 2 | 133.89999999999998 | 1.696 |
| 4 | 2 | 122.84500000000003 | 2.026 |
| -4 | 3 | 235.78 | 2.561 |
| -3 | 3 | 231.588 | 2.09 |
| -2 | 3 | 223.414 | 1.684 |
| -1 | 3 | 208.448 | 1.422 |
| 0 | 3 | 188.216 | 1.38 |
| 1 | 3 | 169.44399999999996 | 1.543 |
| 2 | 3 | 154.94799999999998 | 1.801 |
| 3 | 3 | 143.11700000000002 | 2.071 |
| 4 | 3 | 132.505 | 2.337 |
Browser API · Portable schema
Browser API
Graflume.vector()
const data = [
{
"direction": 310.267,
"high": -1.7,
"magnitude": 2.228,
"value": 1.44,
"x": -4,
"y": -3
},
{
"direction": 322.357,
"high": -1.22,
"magnitude": 1.998,
"value": 1.582,
"x": -3,
"y": -3
},
{
"direction": 335.932,
"high": -0.74,
"magnitude": 1.815,
"value": 1.657,
"x": -2,
"y": -3
},
{
"direction": 350.937,
"high": -0.26,
"magnitude": 1.651,
"value": 1.63,
"x": -1,
"y": -3
},
{
"direction": 8.269000000000005,
"high": 0.22,
"magnitude": 1.53,
"value": 1.514,
"x": 0,
"y": -3
},
{
"direction": 27.187000000000012,
"high": 0.7,
"magnitude": 1.532,
"value": 1.363,
"x": 1,
"y": -3
},
{
"direction": 43.389999999999986,
"high": 1.18,
"magnitude": 1.718,
"value": 1.248,
"x": 2,
"y": -3
},
{
"direction": 53.60000000000002,
"high": 1.66,
"magnitude": 2.062,
"value": 1.224,
"x": 3,
"y": -3
},
{
"direction": 58.69999999999999,
"high": 2.14,
"magnitude": 2.504,
"value": 1.301,
"x": 4,
"y": -3
},
{
"direction": 298.909,
"high": -1.738,
"magnitude": 1.986,
"value": 0.96,
"x": -4,
"y": -2
},
{
"direction": 311.202,
"high": -1.258,
"magnitude": 1.673,
"value": 1.102,
"x": -3,
"y": -2
},
{
"direction": 326.516,
"high": -0.778,
"magnitude": 1.411,
"value": 1.177,
"x": -2,
"y": -2
},
{
"direction": 345.451,
"high": -0.298,
"magnitude": 1.188,
"value": 1.15,
"x": -1,
"y": -2
},
{
"direction": 9.963000000000022,
"high": 0.182,
"magnitude": 1.05,
"value": 1.034,
"x": 0,
"y": -2
},
{
"direction": 36.84699999999998,
"high": 0.662,
"magnitude": 1.103,
"value": 0.883,
"x": 1,
"y": -2
},
{
"direction": 56.06,
"high": 1.142,
"magnitude": 1.376,
"value": 0.768,
"x": 2,
"y": -2
},
{
"direction": 65.358,
"high": 1.622,
"magnitude": 1.784,
"value": 0.744,
"x": 3,
"y": -2
},
{
"direction": 68.65899999999999,
"high": 2.102,
"magnitude": 2.256,
"value": 0.821,
"x": 4,
"y": -2
},
{
"direction": 284.619,
"high": -1.84,
"magnitude": 1.902,
"value": 0.48,
"x": -4,
"y": -1
},
{
"direction": 294.563,
"high": -1.36,
"magnitude": 1.496,
"value": 0.622,
"x": -3,
"y": -1
},
{
"direction": 308.364,
"high": -0.88,
"magnitude": 1.123,
"value": 0.697,
"x": -2,
"y": -1
},
{
"direction": 329.141,
"high": -0.4,
"magnitude": 0.78,
"value": 0.67,
"x": -1,
"y": -1
},
{
"direction": 8.192999999999984,
"high": 0.08,
"magnitude": 0.559,
"value": 0.554,
"x": 0,
"y": -1
},
{
"direction": 54.25799999999998,
"high": 0.56,
"magnitude": 0.69,
"value": 0.403,
"x": 1,
"y": -1
},
{
"direction": 74.50400000000002,
"high": 1.04,
"magnitude": 1.079,
"value": 0.288,
"x": 2,
"y": -1
},
{
"direction": 80.14999999999998,
"high": 1.52,
"magnitude": 1.542,
"value": 0.264,
"x": 3,
"y": -1
},
{
"direction": 80.31900000000002,
"high": 2,
"magnitude": 2.029,
"value": 0.341,
"x": 4,
"y": -1
},
{
"direction": 270,
"high": -1.97,
"magnitude": 1.97,
"value": 0,
"x": -4,
"y": 0
},
{
"direction": 275.434,
"high": -1.49,
"magnitude": 1.497,
"value": 0.142,
"x": -3,
"y": 0
},
{
"direction": 282.115,
"high": -1.01,
"magnitude": 1.033,
"value": 0.217,
"x": -2,
"y": 0
},
{
"direction": 289.714,
"high": -0.53,
"magnitude": 0.563,
"value": 0.19,
"x": -1,
"y": 0
},
{
"direction": 325.853,
"high": -0.05,
"magnitude": 0.089,
"value": 0.074,
"x": 0,
"y": 0
},
{
"direction": 100.17399999999998,
"high": 0.43,
"magnitude": 0.437,
"value": -0.077,
"x": 1,
"y": 0
},
{
"direction": 101.899,
"high": 0.91,
"magnitude": 0.93,
"value": -0.192,
"x": 2,
"y": 0
},
{
"direction": 98.83800000000002,
"high": 1.39,
"magnitude": 1.407,
"value": -0.216,
"x": 3,
"y": 0
},
{
"direction": 94.24700000000001,
"high": 1.87,
"magnitude": 1.875,
"value": -0.139,
"x": 4,
"y": 0
},
{
"direction": 257.019,
"high": -2.082,
"magnitude": 2.137,
"value": -0.48,
"x": -4,
"y": 1
},
{
"direction": 258.078,
"high": -1.602,
"magnitude": 1.638,
"value": -0.338,
"x": -3,
"y": 1
},
{
"direction": 256.801,
"high": -1.122,
"magnitude": 1.153,
"value": -0.263,
"x": -2,
"y": 1
},
{
"direction": 245.691,
"high": -0.642,
"magnitude": 0.705,
"value": -0.29,
"x": -1,
"y": 1
},
{
"direction": 201.766,
"high": -0.162,
"magnitude": 0.437,
"value": -0.406,
"x": 0,
"y": 1
},
{
"direction": 150.30200000000002,
"high": 0.318,
"magnitude": 0.641,
"value": -0.557,
"x": 1,
"y": 1
},
{
"direction": 130.098,
"high": 0.798,
"magnitude": 1.043,
"value": -0.672,
"x": 2,
"y": 1
},
{
"direction": 118.582,
"high": 1.278,
"magnitude": 1.455,
"value": -0.696,
"x": 3,
"y": 1
},
{
"direction": 109.39600000000002,
"high": 1.758,
"magnitude": 1.864,
"value": -0.619,
"x": 4,
"y": 1
},
{
"direction": 245.817,
"high": -2.138,
"magnitude": 2.343,
"value": -0.96,
"x": -4,
"y": 2
},
{
"direction": 243.73,
"high": -1.658,
"magnitude": 1.849,
"value": -0.818,
"x": -3,
"y": 2
},
{
"direction": 237.748,
"high": -1.178,
"magnitude": 1.393,
"value": -0.743,
"x": -2,
"y": 2
},
{
"direction": 222.18,
"high": -0.698,
"magnitude": 1.039,
"value": -0.77,
"x": -1,
"y": 2
},
{
"direction": 193.806,
"high": -0.218,
"magnitude": 0.913,
"value": -0.886,
"x": 0,
"y": 2
},
{
"direction": 165.813,
"high": 0.262,
"magnitude": 1.07,
"value": -1.037,
"x": 1,
"y": 2
},
{
"direction": 147.202,
"high": 0.742,
"magnitude": 1.37,
"value": -1.152,
"x": 2,
"y": 2
},
{
"direction": 133.89999999999998,
"high": 1.222,
"magnitude": 1.696,
"value": -1.176,
"x": 3,
"y": 2
},
{
"direction": 122.84500000000003,
"high": 1.702,
"magnitude": 2.026,
"value": -1.099,
"x": 4,
"y": 2
},
{
"direction": 235.78,
"high": -2.117,
"magnitude": 2.561,
"value": -1.44,
"x": -4,
"y": 3
},
{
"direction": 231.588,
"high": -1.637,
"magnitude": 2.09,
"value": -1.298,
"x": -3,
"y": 3
},
{
"direction": 223.414,
"high": -1.157,
"magnitude": 1.684,
"value": -1.223,
"x": -2,
"y": 3
},
{
"direction": 208.448,
"high": -0.677,
"magnitude": 1.422,
"value": -1.25,
"x": -1,
"y": 3
},
{
"direction": 188.216,
"high": -0.197,
"magnitude": 1.38,
"value": -1.366,
"x": 0,
"y": 3
},
{
"direction": 169.44399999999996,
"high": 0.283,
"magnitude": 1.543,
"value": -1.517,
"x": 1,
"y": 3
},
{
"direction": 154.94799999999998,
"high": 0.763,
"magnitude": 1.801,
"value": -1.632,
"x": 2,
"y": 3
},
{
"direction": 143.11700000000002,
"high": 1.243,
"magnitude": 2.071,
"value": -1.656,
"x": 3,
"y": 3
},
{
"direction": 132.505,
"high": 1.723,
"magnitude": 2.337,
"value": -1.579,
"x": 4,
"y": 3
}
];
const options = {
"accessibility": {
"description": "A balanced vortex keeps direction, magnitude, and the calm center visible. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Vector field chart: A balanced vortex keeps direction, magnitude, and the calm center visible"
},
"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": "direction",
"type": "datum",
"value": 325.853
},
"text": "Point and range highlights · 0"
}
],
"axes": {
"x": {
"format": {
"fractionDigits": 0,
"suffix": " km",
"type": "number"
},
"ticks": {
"count": 5
},
"title": {
"text": "East–west distance"
}
},
"y": {
"format": {
"fractionDigits": 0,
"suffix": " km",
"type": "number"
},
"ticks": {
"count": 5
},
"title": {
"text": "North–south distance"
}
}
},
"create": {
"adaptive": {
"profiles": "auto"
}
},
"height": 620,
"highlights": [
{
"id": "manual-focus",
"padding": 7,
"target": {
"field": "direction",
"type": "datum",
"value": 325.853
}
}
],
"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": "direction",
"mode": "multiple",
"toggle": true
},
"tooltip": {
"fields": [
{
"field": "x",
"format": "number",
"label": "X"
},
{
"field": "y",
"format": "number",
"label": "Y"
},
{
"field": "direction",
"format": "number",
"fractionDigits": 0,
"label": "Direction",
"suffix": "°"
},
{
"field": "magnitude",
"format": "number",
"label": "Magnitude"
}
],
"title": "Vector field",
"trigger": "mark"
}
},
"legend": {
"interactive": false,
"items": [
{
"id": "semantic-0",
"label": "Magnitude · length"
}
],
"labels": {
"hide": "Hide",
"show": "Show"
},
"maxItems": 8,
"mode": "layers",
"orientation": "horizontal",
"position": "bottom",
"title": "Vector field",
"visible": true
},
"locale": "en",
"mark": {
"fields": {
"direction": "direction",
"magnitude": "magnitude"
}
},
"padding": {
"top": 52
},
"theme": "graflume-light",
"title": {
"subtitle": "A balanced vortex keeps direction, magnitude, and the calm center visible",
"text": "Vector field chart"
},
"width": "container",
"x": {
"field": "x",
"title": "Horizontal position",
"type": "quantitative"
},
"y": {
"field": "y",
"title": "Vertical position",
"type": "quantitative"
}
};
Graflume.vector('#chart', data, options);Portable schema
ChartSpec 0.1 · options
{
"accessibility": {
"description": "A balanced vortex keeps direction, magnitude, and the calm center visible. The example uses curated, deterministic data and exposes its exact values in a semantic table.",
"label": "Vector field chart: A balanced vortex keeps direction, magnitude, and the calm center visible"
},
"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": "direction",
"type": "datum",
"value": 325.853
},
"text": "Point and range highlights · 0"
}
],
"axes": {
"x": {
"format": {
"fractionDigits": 0,
"suffix": " km",
"type": "number"
},
"ticks": {
"count": 5
},
"title": {
"text": "East–west distance"
}
},
"y": {
"format": {
"fractionDigits": 0,
"suffix": " km",
"type": "number"
},
"ticks": {
"count": 5
},
"title": {
"text": "North–south distance"
}
}
},
"create": {
"adaptive": {
"profiles": "auto"
}
},
"height": 620,
"highlights": [
{
"id": "manual-focus",
"padding": 7,
"target": {
"field": "direction",
"type": "datum",
"value": 325.853
}
}
],
"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": "direction",
"mode": "multiple",
"toggle": true
},
"tooltip": {
"fields": [
{
"field": "x",
"format": "number",
"label": "X"
},
{
"field": "y",
"format": "number",
"label": "Y"
},
{
"field": "direction",
"format": "number",
"fractionDigits": 0,
"label": "Direction",
"suffix": "°"
},
{
"field": "magnitude",
"format": "number",
"label": "Magnitude"
}
],
"title": "Vector field",
"trigger": "mark"
}
},
"legend": {
"interactive": false,
"items": [
{
"id": "semantic-0",
"label": "Magnitude · length"
}
],
"labels": {
"hide": "Hide",
"show": "Show"
},
"maxItems": 8,
"mode": "layers",
"orientation": "horizontal",
"position": "bottom",
"title": "Vector field",
"visible": true
},
"locale": "en",
"mark": {
"fields": {
"direction": "direction",
"magnitude": "magnitude"
}
},
"padding": {
"top": 52
},
"theme": "graflume-light",
"title": {
"subtitle": "A balanced vortex keeps direction, magnitude, and the calm center visible",
"text": "Vector field chart"
},
"width": "container",
"x": {
"field": "x",
"title": "Horizontal position",
"type": "quantitative"
},
"y": {
"field": "y",
"title": "Vertical position",
"type": "quantitative"
}
}