From f4d928a4e9f3272e0b24025e7243499d023dca76 Mon Sep 17 00:00:00 2001 From: Kanit Wongsuphasawat Date: Fri, 28 Apr 2023 15:07:02 -0700 Subject: [PATCH] fix: remove incorrect stack transform from charts with one linear Q-axis one non-linear Q-axis. (#8871) Co-authored-by: GitHub Actions Bot --- examples/compiled/bar_q_qpow.png | Bin 0 -> 6780 bytes examples/compiled/bar_q_qpow.svg | 1 + examples/compiled/bar_q_qpow.vg.json | 117 +++++++++++++++++++++++++++ examples/specs/bar_q_qpow.vl.json | 15 ++++ src/stack.ts | 13 +-- test/stack.test.ts | 2 +- 6 files changed, 137 insertions(+), 11 deletions(-) create mode 100644 examples/compiled/bar_q_qpow.png create mode 100644 examples/compiled/bar_q_qpow.svg create mode 100644 examples/compiled/bar_q_qpow.vg.json create mode 100644 examples/specs/bar_q_qpow.vl.json diff --git a/examples/compiled/bar_q_qpow.png b/examples/compiled/bar_q_qpow.png new file mode 100644 index 0000000000000000000000000000000000000000..4218f3713afabfedb78f117e3859c7e16a4ecc93 GIT binary patch literal 6780 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 literal 0 HcmV?d00001 diff --git a/examples/compiled/bar_q_qpow.svg b/examples/compiled/bar_q_qpow.svg new file mode 100644 index 0000000000..8e92fa51fe --- /dev/null +++ b/examples/compiled/bar_q_qpow.svg @@ -0,0 +1 @@ +3,0003,2003,4003,6003,8004,000a01020304050b \ No newline at end of file diff --git a/examples/compiled/bar_q_qpow.vg.json b/examples/compiled/bar_q_qpow.vg.json new file mode 100644 index 0000000000..6887375a4b --- /dev/null +++ b/examples/compiled/bar_q_qpow.vg.json @@ -0,0 +1,117 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "background": "white", + "padding": 5, + "width": 200, + "height": 200, + "style": "cell", + "data": [ + { + "name": "source_0", + "values": [ + {"a": 3000, "b": 55}, + {"a": 3500, "b": 28}, + {"a": 4000, "b": 55} + ] + }, + { + "name": "data_0", + "source": "source_0", + "transform": [ + { + "type": "filter", + "expr": "isValid(datum[\"a\"]) && isFinite(+datum[\"a\"]) && isValid(datum[\"b\"]) && isFinite(+datum[\"b\"])" + } + ] + } + ], + "marks": [ + { + "name": "marks", + "type": "rect", + "style": ["bar"], + "from": {"data": "data_0"}, + "encode": { + "update": { + "fill": {"value": "#4c78a8"}, + "ariaRoleDescription": {"value": "bar"}, + "description": { + "signal": "\"a: \" + (format(datum[\"a\"], \"\")) + \"; b: \" + (format(datum[\"b\"], \"\"))" + }, + "xc": {"scale": "x", "field": "a"}, + "width": {"value": 5}, + "y": {"scale": "y", "field": "b"}, + "y2": {"scale": "y", "value": 0} + } + } + } + ], + "scales": [ + { + "name": "x", + "type": "linear", + "domain": {"data": "data_0", "field": "a"}, + "range": [0, {"signal": "width"}], + "nice": true, + "zero": false, + "padding": 5 + }, + { + "name": "y", + "type": "pow", + "domain": {"data": "data_0", "field": "b"}, + "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": "a", + "labelFlush": true, + "labelOverlap": true, + "tickCount": {"signal": "ceil(width/40)"}, + "zindex": 0 + }, + { + "scale": "y", + "orient": "left", + "grid": false, + "title": "b", + "labelOverlap": true, + "tickCount": {"signal": "ceil(height/40)"}, + "zindex": 0 + } + ] +} diff --git a/examples/specs/bar_q_qpow.vl.json b/examples/specs/bar_q_qpow.vl.json new file mode 100644 index 0000000000..a246a6bd58 --- /dev/null +++ b/examples/specs/bar_q_qpow.vl.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": { + "values": [ + {"a": 3000, "b": 55}, + {"a": 3500, "b": 28}, + {"a": 4000, "b": 55} + ] + }, + "mark": "bar", + "encoding": { + "x": {"field": "a", "type": "quantitative"}, + "y": {"field": "b", "type": "quantitative", "scale": {"type": "pow"}} + } +} diff --git a/src/stack.ts b/src/stack.ts index fb4663b7c0..22fa87ce12 100644 --- a/src/stack.ts +++ b/src/stack.ts @@ -104,15 +104,6 @@ function potentialStackedChannel( // if there is no explicit stacking, only apply stack if there is only one aggregate for x or y if (xAggregate !== yAggregate) { return xAggregate ? x : y; - } else { - const xScale = xDef.scale?.type; - const yScale = yDef.scale?.type; - - if (xScale && xScale !== 'linear') { - return y; - } else if (yScale && yScale !== 'linear') { - return x; - } } if (isCartesian && mark === 'bar') { @@ -247,7 +238,9 @@ export function stack(m: Mark | MarkDef, encoding: Encoding): StackPrope // warn when stacking non-linear if (stackedFieldDef?.scale?.type && stackedFieldDef?.scale?.type !== ScaleType.LINEAR) { - log.warn(log.message.cannotStackNonLinearScale(stackedFieldDef.scale.type)); + if (stackedFieldDef?.stack) { + log.warn(log.message.cannotStackNonLinearScale(stackedFieldDef.scale.type)); + } return null; } diff --git a/test/stack.test.ts b/test/stack.test.ts index e66556691f..f8d29dc23d 100644 --- a/test/stack.test.ts +++ b/test/stack.test.ts @@ -234,7 +234,7 @@ describe('stack', () => { it( 'should always warn if the aggregated axis has non-linear scale', log.wrap(localLogger => { - for (const s of [undefined, 'center', 'zero', 'normalize'] as const) { + for (const s of ['center', 'zero', 'normalize'] as const) { for (const scaleType of [ScaleType.LOG, ScaleType.POW, ScaleType.SQRT]) { const marks = s === undefined ? STACK_BY_DEFAULT_NON_POLAR_MARKS : STACKABLE_NON_POLAR_MARKS; for (const mark of marks) {