From 43d3dee23ccbaae3dad9cf933d7b61928f6869b2 Mon Sep 17 00:00:00 2001 From: Younghoon Kim Date: Tue, 11 Oct 2022 17:01:43 -0700 Subject: [PATCH] fix: Remove x2/y2 channels for overlaying line and point (#8472) * add example * Remove y2/x2 channel for overlaying lines and points * Add comment --- examples/compiled/area_overlay_with_y2.png | Bin 0 -> 15049 bytes examples/compiled/area_overlay_with_y2.svg | 1 + .../compiled/area_overlay_with_y2.vg.json | 166 ++++++++++++++++++ examples/specs/area_overlay_with_y2.vl.json | 12 ++ .../area_overlay_with_y2_normalized.vl.json | 30 ++++ src/normalize/pathoverlay.ts | 5 + test/normalize/pathoverlay.test.ts | 42 +++++ 7 files changed, 256 insertions(+) create mode 100644 examples/compiled/area_overlay_with_y2.png create mode 100644 examples/compiled/area_overlay_with_y2.svg create mode 100644 examples/compiled/area_overlay_with_y2.vg.json create mode 100644 examples/specs/area_overlay_with_y2.vl.json create mode 100644 examples/specs/normalized/area_overlay_with_y2_normalized.vl.json diff --git a/examples/compiled/area_overlay_with_y2.png b/examples/compiled/area_overlay_with_y2.png new file mode 100644 index 0000000000000000000000000000000000000000..8e489363d692733f8c7a5a2e8e8fde9ef02ef2c3 GIT binary patch literal 15049 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 \ No newline at end of file diff --git a/examples/compiled/area_overlay_with_y2.vg.json b/examples/compiled/area_overlay_with_y2.vg.json new file mode 100644 index 0000000000..1f3b7fd7fa --- /dev/null +++ b/examples/compiled/area_overlay_with_y2.vg.json @@ -0,0 +1,166 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "description": "Google's stock price over time.", + "background": "white", + "padding": 5, + "width": 200, + "height": 200, + "style": "cell", + "data": [ + { + "name": "source_0", + "url": "data/stocks.csv", + "format": {"type": "csv", "parse": {"date": "date"}}, + "transform": [{"type": "filter", "expr": "datum.symbol==='GOOG'"}] + }, + { + "name": "data_0", + "source": "source_0", + "transform": [ + { + "type": "filter", + "expr": "(isDate(datum[\"date\"]) || (isValid(datum[\"date\"]) && isFinite(+datum[\"date\"]))) && isValid(datum[\"price\"]) && isFinite(+datum[\"price\"])" + } + ] + } + ], + "marks": [ + { + "name": "layer_0_marks", + "type": "area", + "style": ["area"], + "sort": {"field": "datum[\"date\"]"}, + "from": {"data": "source_0"}, + "encode": { + "update": { + "opacity": {"value": 0.7}, + "orient": {"value": "vertical"}, + "fill": {"value": "#4c78a8"}, + "description": { + "signal": "\"date: \" + (timeFormat(datum[\"date\"], '%b %d, %Y')) + \"; price: \" + (format(datum[\"price\"], \"\"))" + }, + "x": {"scale": "x", "field": "date"}, + "y": {"scale": "y", "field": "price"}, + "y2": {"scale": "y", "value": 0}, + "defined": { + "signal": "isValid(datum[\"date\"]) && isFinite(+datum[\"date\"]) && isValid(datum[\"price\"]) && isFinite(+datum[\"price\"])" + } + } + } + }, + { + "name": "layer_1_marks", + "type": "line", + "style": ["line"], + "sort": {"field": "datum[\"date\"]"}, + "from": {"data": "source_0"}, + "encode": { + "update": { + "stroke": {"value": "#4c78a8"}, + "description": { + "signal": "\"date: \" + (timeFormat(datum[\"date\"], '%b %d, %Y')) + \"; price: \" + (format(datum[\"price\"], \"\"))" + }, + "x": {"scale": "x", "field": "date"}, + "y": {"scale": "y", "field": "price"}, + "defined": { + "signal": "isValid(datum[\"date\"]) && isFinite(+datum[\"date\"]) && isValid(datum[\"price\"]) && isFinite(+datum[\"price\"])" + } + } + } + }, + { + "name": "layer_2_marks", + "type": "symbol", + "style": ["point"], + "from": {"data": "data_0"}, + "encode": { + "update": { + "opacity": {"value": 1}, + "fill": {"value": "#4c78a8"}, + "ariaRoleDescription": {"value": "point"}, + "description": { + "signal": "\"date: \" + (timeFormat(datum[\"date\"], '%b %d, %Y')) + \"; price: \" + (format(datum[\"price\"], \"\"))" + }, + "x": {"scale": "x", "field": "date"}, + "y": {"scale": "y", "field": "price"} + } + } + } + ], + "scales": [ + { + "name": "x", + "type": "time", + "domain": { + "fields": [ + {"data": "source_0", "field": "date"}, + {"data": "data_0", "field": "date"} + ] + }, + "range": [0, {"signal": "width"}] + }, + { + "name": "y", + "type": "linear", + "domain": { + "fields": [ + {"data": "source_0", "field": "price"}, + [0], + {"data": "data_0", "field": "price"} + ] + }, + "range": [{"signal": "height"}, 0], + "nice": true, + "zero": true + } + ], + "axes": [ + { + "scale": "x", + "orient": "bottom", + "gridScale": "y", + "grid": true, + "tickCount": {"signal": "ceil(width/40)"}, + "domain": false, + "labels": false, + "aria": false, + "maxExtent": 0, + "minExtent": 0, + "ticks": false, + "zindex": 0 + }, + { + "scale": "y", + "orient": "left", + "gridScale": "x", + "grid": true, + "tickCount": {"signal": "ceil(height/40)"}, + "domain": false, + "labels": false, + "aria": false, + "maxExtent": 0, + "minExtent": 0, + "ticks": false, + "zindex": 0 + }, + { + "scale": "x", + "orient": "bottom", + "grid": false, + "title": "date", + "labelFlush": true, + "labelOverlap": true, + "tickCount": {"signal": "ceil(width/40)"}, + "zindex": 0 + }, + { + "scale": "y", + "orient": "left", + "grid": false, + "title": "price", + "labelOverlap": true, + "tickCount": {"signal": "ceil(height/40)"}, + "zindex": 0 + } + ] +} diff --git a/examples/specs/area_overlay_with_y2.vl.json b/examples/specs/area_overlay_with_y2.vl.json new file mode 100644 index 0000000000..4f4af3426d --- /dev/null +++ b/examples/specs/area_overlay_with_y2.vl.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "description": "Google's stock price over time.", + "data": {"url": "data/stocks.csv"}, + "transform": [{"filter": "datum.symbol==='GOOG'"}], + "mark": {"type": "area", "line": true, "point": true}, + "encoding": { + "x": {"field": "date", "type": "temporal"}, + "y": {"field": "price", "type": "quantitative"}, + "y2": {"datum": 0, "type": "quantitative"} + } +} diff --git a/examples/specs/normalized/area_overlay_with_y2_normalized.vl.json b/examples/specs/normalized/area_overlay_with_y2_normalized.vl.json new file mode 100644 index 0000000000..9052e00bd0 --- /dev/null +++ b/examples/specs/normalized/area_overlay_with_y2_normalized.vl.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "description": "Google's stock price over time.", + "data": {"url": "data/stocks.csv"}, + "transform": [{"filter": "datum.symbol==='GOOG'"}], + "layer": [ + { + "mark": {"opacity": 0.7, "type": "area"}, + "encoding": { + "x": {"field": "date", "type": "temporal"}, + "y": {"field": "price", "type": "quantitative"}, + "y2": {"datum": 0, "type": "quantitative"} + } + }, + { + "mark": {"type": "line"}, + "encoding": { + "x": {"field": "date", "type": "temporal"}, + "y": {"field": "price", "type": "quantitative"} + } + }, + { + "mark": {"type": "point", "opacity": 1, "filled": true}, + "encoding": { + "x": {"field": "date", "type": "temporal"}, + "y": {"field": "price", "type": "quantitative"} + } + } + ] +} \ No newline at end of file diff --git a/src/normalize/pathoverlay.ts b/src/normalize/pathoverlay.ts index 333cd2b84c..33e988f7a0 100644 --- a/src/normalize/pathoverlay.ts +++ b/src/normalize/pathoverlay.ts @@ -143,6 +143,11 @@ export class PathOverlayNormalizer implements NonFacetUnitNormalizer { }); }); + it('correctly normalizes area using y2 with overlay line.', () => { + const spec: TopLevelSpec = { + data: {url: 'data/stocks.csv'}, + mark: 'area', + encoding: { + x: {field: 'date', type: 'temporal'}, + y: {field: 'price', type: 'quantitative'}, + y2: {value: 0, type: 'quantitative'} + }, + config: {area: {line: {}, point: {}}} + }; + const normalizedSpec = normalize(spec); + expect(normalizedSpec).toEqual({ + data: {url: 'data/stocks.csv'}, + layer: [ + { + mark: {type: 'area', opacity: 0.7}, + encoding: { + x: {field: 'date', type: 'temporal'}, + y: {field: 'price', type: 'quantitative'}, + y2: {value: 0, type: 'quantitative'} + } + }, + { + mark: {type: 'line'}, + encoding: { + x: {field: 'date', type: 'temporal'}, + y: {field: 'price', type: 'quantitative', stack: 'zero'} + } + }, + { + mark: {type: 'point', opacity: 1, filled: true}, + encoding: { + x: {field: 'date', type: 'temporal'}, + y: {field: 'price', type: 'quantitative', stack: 'zero'} + } + } + ], + config: {area: {line: {}, point: {}}} + }); + }); + it('correctly normalizes interpolated area with overlay line', () => { const spec: TopLevelSpec = { data: {url: 'data/stocks.csv'},