From 217e860c4ca829c6be14393e5fb65116ddb577ca Mon Sep 17 00:00:00 2001 From: Younghoon Kim Date: Wed, 12 Oct 2022 17:06:04 -0700 Subject: [PATCH] fix: Init the better orient for the ranged bar (#8475) * Add example for ranged bar with not binned position channels * Change the init logic to assgin better orient for ranged bar --- examples/compiled/bar_ranged_not_binned.png | Bin 0 -> 5821 bytes examples/compiled/bar_ranged_not_binned.svg | 1 + .../compiled/bar_ranged_not_binned.vg.json | 123 ++++++++++++++++++ examples/compiled/histogram_nonlinear.png | Bin 7060 -> 6999 bytes examples/compiled/histogram_nonlinear.svg | 2 +- .../compiled/layer_cumulative_histogram.png | Bin 10451 -> 9849 bytes .../compiled/layer_cumulative_histogram.svg | 2 +- .../layer_cumulative_histogram.vg.json | 60 ++++----- examples/compiled/wheat_wages.png | Bin 31648 -> 32175 bytes examples/compiled/wheat_wages.svg | 2 +- examples/compiled/wheat_wages.vg.json | 41 +++--- examples/specs/bar_ranged_not_binned.vl.json | 16 +++ examples/specs/histogram_nonlinear.vl.json | 2 +- .../specs/layer_cumulative_histogram.vl.json | 3 +- ...er_cumulative_histogram_normalized.vl.json | 6 +- .../normalized/wheat_wages_normalized.vl.json | 5 +- examples/specs/wheat_wages.vl.json | 4 +- src/compile/mark/init.ts | 14 +- test/compile/mark/bar.test.ts | 66 ++++++++-- test/compile/mark/init.test.ts | 40 ++++++ 20 files changed, 305 insertions(+), 82 deletions(-) create mode 100644 examples/compiled/bar_ranged_not_binned.png create mode 100644 examples/compiled/bar_ranged_not_binned.svg create mode 100644 examples/compiled/bar_ranged_not_binned.vg.json create mode 100644 examples/specs/bar_ranged_not_binned.vl.json diff --git a/examples/compiled/bar_ranged_not_binned.png b/examples/compiled/bar_ranged_not_binned.png new file mode 100644 index 0000000000000000000000000000000000000000..40885562b47ccc22477eb36d3b265bf8832bc498 GIT binary patch literal 5821 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 PkA`$K^wcX=ZKD1I`FadK literal 0 HcmV?d00001 diff --git a/examples/compiled/bar_ranged_not_binned.svg b/examples/compiled/bar_ranged_not_binned.svg new file mode 100644 index 0000000000..1ede95e794 --- /dev/null +++ b/examples/compiled/bar_ranged_not_binned.svg @@ -0,0 +1 @@ +20406080100b020406080100b, b2 \ No newline at end of file diff --git a/examples/compiled/bar_ranged_not_binned.vg.json b/examples/compiled/bar_ranged_not_binned.vg.json new file mode 100644 index 0000000000..220fcb013b --- /dev/null +++ b/examples/compiled/bar_ranged_not_binned.vg.json @@ -0,0 +1,123 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "background": "white", + "padding": 5, + "width": 200, + "height": 200, + "style": "cell", + "data": [ + { + "name": "source_0", + "values": [ + {"b": 28, "b2": 0}, + {"b": 55, "b2": 0}, + {"b": 43, "b2": 0}, + {"b": 91, "b2": 0}, + {"b": 81, "b2": 0}, + {"b": 53, "b2": 0}, + {"b": 19, "b2": 0}, + {"b": 87, "b2": 0}, + {"b": 52, "b2": 0} + ] + }, + { + "name": "data_0", + "source": "source_0", + "transform": [ + { + "type": "filter", + "expr": "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": "\"b: \" + (format(datum[\"b\"], \"\")) + \"; b2: \" + (format(datum[\"b2\"], \"\"))" + }, + "xc": {"scale": "x", "field": "b"}, + "width": {"value": 5}, + "y": {"scale": "y", "field": "b"}, + "y2": {"scale": "y", "field": "b2"} + } + } + } + ], + "scales": [ + { + "name": "x", + "type": "linear", + "domain": {"data": "data_0", "field": "b"}, + "range": [0, {"signal": "width"}], + "nice": true, + "zero": false, + "padding": 5 + }, + { + "name": "y", + "type": "linear", + "domain": {"data": "data_0", "fields": ["b", "b2"]}, + "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": "b", + "labelFlush": true, + "labelOverlap": true, + "tickCount": {"signal": "ceil(width/40)"}, + "zindex": 0 + }, + { + "scale": "y", + "orient": "left", + "grid": false, + "title": "b, b2", + "labelOverlap": true, + "tickCount": {"signal": "ceil(height/40)"}, + "zindex": 0 + } + ] +} diff --git a/examples/compiled/histogram_nonlinear.png b/examples/compiled/histogram_nonlinear.png index d062997056f82e7f849e1b1cd93c2668a5c7001c..14fd59ba2fec1aa5a5fdea9cb6a623fca74bf41c 100644 GIT binary patch literal 6999 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 E0KqY5jQ{`u literal 7060 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 \ No newline at end of file +08.3312.5016.6733.3350.0066.6783.330%50%100%Distribution of Frame Render Time (ms) \ No newline at end of file diff --git a/examples/compiled/layer_cumulative_histogram.png b/examples/compiled/layer_cumulative_histogram.png index dfa42c17a0be9e8bfe39a15ca8821def029e295c..03ccb7fa23eb67624025489693eb814791037f58 100644 GIT binary patch literal 9849 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 TQk;cn$q;hVN>Z7UIF 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 b;vp#f_UqTp^f@@Ch \ No newline at end of file +246810IMDB Rating05001,0001,5002,0002,5003,000Cumulative Count, count \ No newline at end of file diff --git a/examples/compiled/layer_cumulative_histogram.vg.json b/examples/compiled/layer_cumulative_histogram.vg.json index 86f4c6f9c6..eb388db23d 100644 --- a/examples/compiled/layer_cumulative_histogram.vg.json +++ b/examples/compiled/layer_cumulative_histogram.vg.json @@ -47,6 +47,14 @@ "name": "data_0", "source": "source_0", "transform": [ + { + "type": "stack", + "groupby": ["bin_IMDB_Rating", "bin_IMDB_Rating"], + "field": "Cumulative Count", + "sort": {"field": [], "order": []}, + "as": ["Cumulative Count_start", "Cumulative Count_end"], + "offset": "zero" + }, { "type": "filter", "expr": "isValid(datum[\"bin_IMDB_Rating\"]) && isFinite(+datum[\"bin_IMDB_Rating\"]) && isValid(datum[\"Cumulative Count\"]) && isFinite(+datum[\"Cumulative Count\"])" @@ -57,6 +65,14 @@ "name": "data_1", "source": "source_0", "transform": [ + { + "type": "stack", + "groupby": ["bin_IMDB_Rating", "bin_IMDB_Rating"], + "field": "count", + "sort": {"field": [], "order": []}, + "as": ["count_start", "count_end"], + "offset": "zero" + }, { "type": "filter", "expr": "isValid(datum[\"bin_IMDB_Rating\"]) && isFinite(+datum[\"bin_IMDB_Rating\"]) && isValid(datum[\"count\"]) && isFinite(+datum[\"count\"])" @@ -75,12 +91,12 @@ "fill": {"value": "#4c78a8"}, "ariaRoleDescription": {"value": "bar"}, "description": { - "signal": "\"IMDB Rating: \" + (format(datum[\"bin_IMDB_Rating\"], \"\")) + \"; Cumulative Count: \" + (format(datum[\"Cumulative Count\"], \"\")) + \"; bin_IMDB_Rating_end: \" + (format(datum[\"bin_IMDB_Rating_end\"], \"\"))" + "signal": "\"IMDB Rating: \" + (!isValid(datum[\"bin_IMDB_Rating\"]) || !isFinite(+datum[\"bin_IMDB_Rating\"]) ? \"null\" : format(datum[\"bin_IMDB_Rating\"], \"\") + \" – \" + format(datum[\"bin_IMDB_Rating_end\"], \"\")) + \"; Cumulative Count: \" + (format(datum[\"Cumulative Count\"], \"\"))" }, - "x": {"scale": "x", "field": "bin_IMDB_Rating"}, - "x2": {"scale": "x", "field": "bin_IMDB_Rating_end"}, - "y": {"scale": "y", "field": "Cumulative Count"}, - "y2": {"scale": "y", "value": 0} + "x2": {"scale": "x", "field": "bin_IMDB_Rating", "offset": 1}, + "x": {"scale": "x", "field": "bin_IMDB_Rating_end"}, + "y": {"scale": "y", "field": "Cumulative Count_end"}, + "y2": {"scale": "y", "field": "Cumulative Count_start"} } } }, @@ -95,12 +111,12 @@ "fill": {"value": "yellow"}, "ariaRoleDescription": {"value": "bar"}, "description": { - "signal": "\"IMDB Rating: \" + (format(datum[\"bin_IMDB_Rating\"], \"\")) + \"; count: \" + (format(datum[\"count\"], \"\")) + \"; bin_IMDB_Rating_end: \" + (format(datum[\"bin_IMDB_Rating_end\"], \"\"))" + "signal": "\"IMDB Rating: \" + (!isValid(datum[\"bin_IMDB_Rating\"]) || !isFinite(+datum[\"bin_IMDB_Rating\"]) ? \"null\" : format(datum[\"bin_IMDB_Rating\"], \"\") + \" – \" + format(datum[\"bin_IMDB_Rating_end\"], \"\")) + \"; count: \" + (format(datum[\"count\"], \"\"))" }, - "x": {"scale": "x", "field": "bin_IMDB_Rating"}, - "x2": {"scale": "x", "field": "bin_IMDB_Rating_end"}, - "y": {"scale": "y", "field": "count"}, - "y2": {"scale": "y", "value": 0} + "x2": {"scale": "x", "field": "bin_IMDB_Rating", "offset": 1}, + "x": {"scale": "x", "field": "bin_IMDB_Rating_end"}, + "y": {"scale": "y", "field": "count_end"}, + "y2": {"scale": "y", "field": "count_start"} } } } @@ -118,17 +134,17 @@ ] }, "range": [0, {"signal": "width"}], - "zero": false, - "nice": true, - "padding": 5 + "zero": false }, { "name": "y", "type": "linear", "domain": { "fields": [ - {"data": "data_0", "field": "Cumulative Count"}, - {"data": "data_1", "field": "count"} + {"data": "data_0", "field": "Cumulative Count_start"}, + {"data": "data_0", "field": "Cumulative Count_end"}, + {"data": "data_1", "field": "count_start"}, + {"data": "data_1", "field": "count_end"} ] }, "range": [{"signal": "height"}, 0], @@ -137,20 +153,6 @@ } ], "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", diff --git a/examples/compiled/wheat_wages.png b/examples/compiled/wheat_wages.png index 67270dcb31aac18ec4fb0b11d88bbed32ff1770e..1eb3eea86bc86a686da6f0ee7e407b7ee69acf9c 100644 GIT binary patch literal 32175 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 B%X|O; diff --git a/examples/compiled/wheat_wages.svg b/examples/compiled/wheat_wages.svg index 6297842c35..d534496c1f 100644 --- a/examples/compiled/wheat_wages.svg +++ b/examples/compiled/wheat_wages.svg @@ -1 +1 @@ -16001650170017501800ElizabethJames ICharles ICromwellCharles IIJames IIW&MAnneGeorge IGeorge IIGeorge IIIGeorge IV0102030405060708090100 \ No newline at end of file +16001650170017501800ElizabethJames ICharles ICromwellCharles IIJames IIW&MAnneGeorge IGeorge IIGeorge IIIGeorge IV0102030405060708090100 \ No newline at end of file diff --git a/examples/compiled/wheat_wages.vg.json b/examples/compiled/wheat_wages.vg.json index 64bd031025..332b33349b 100644 --- a/examples/compiled/wheat_wages.vg.json +++ b/examples/compiled/wheat_wages.vg.json @@ -33,6 +33,14 @@ "name": "data_0", "source": "source_0", "transform": [ + { + "type": "stack", + "groupby": ["year", "year"], + "field": "wheat", + "sort": {"field": [], "order": []}, + "as": ["wheat_start", "wheat_end"], + "offset": "zero" + }, { "type": "filter", "expr": "isValid(datum[\"year\"]) && isFinite(+datum[\"year\"]) && isValid(datum[\"wheat\"]) && isFinite(+datum[\"wheat\"])" @@ -98,12 +106,12 @@ "stroke": {"value": "#999"}, "ariaRoleDescription": {"value": "bar"}, "description": { - "signal": "\"year: \" + (format(datum[\"year\"], \"d\")) + \"; wheat: \" + (format(datum[\"wheat\"], \"\")) + \"; year_end: \" + (format(datum[\"year_end\"], \"\"))" + "signal": "\"year: \" + (!isValid(datum[\"year\"]) || !isFinite(+datum[\"year\"]) ? \"null\" : format(datum[\"year\"], \"d\") + \" – \" + format(datum[\"year_end\"], \"d\")) + \"; wheat: \" + (format(datum[\"wheat\"], \"\"))" }, - "x": {"scale": "x", "field": "year"}, - "x2": {"scale": "x", "field": "year_end"}, - "y": {"scale": "y", "field": "wheat"}, - "y2": {"scale": "y", "value": 0} + "x2": {"scale": "x", "field": "year", "offset": 1}, + "x": {"scale": "x", "field": "year_end"}, + "y": {"scale": "y", "field": "wheat_end"}, + "y2": {"scale": "y", "field": "wheat_start"} } } }, @@ -193,13 +201,12 @@ { "name": "layer_5_marks", "type": "rect", - "style": ["bar"], + "style": ["rect"], "from": {"data": "data_2"}, "encode": { "update": { "stroke": {"value": "#000"}, "fill": {"scale": "fill", "field": "commonwealth"}, - "ariaRoleDescription": {"value": "bar"}, "description": { "signal": "\"start: \" + (format(datum[\"start\"], \"d\")) + \"; y: \" + (format(datum[\"y\"], \"\")) + \"; end: \" + (format(datum[\"end\"], \"\")) + \"; offset: \" + (format(datum[\"offset\"], \"\")) + \"; commonwealth: \" + (isValid(datum[\"commonwealth\"]) ? datum[\"commonwealth\"] : \"\"+datum[\"commonwealth\"])" }, @@ -251,15 +258,15 @@ }, "range": [0, {"signal": "width"}], "nice": true, - "zero": false, - "padding": 5 + "zero": false }, { "name": "y", "type": "linear", "domain": { "fields": [ - {"data": "data_0", "field": "wheat"}, + {"data": "data_0", "field": "wheat_start"}, + {"data": "data_0", "field": "wheat_end"}, {"data": "source_0", "field": "wages"}, {"data": "data_2", "field": "y"}, {"data": "data_2", "field": "offset"}, @@ -278,20 +285,6 @@ } ], "axes": [ - { - "scale": "x", - "orient": "bottom", - "tickCount": 5, - "gridScale": "y", - "grid": true, - "domain": false, - "labels": false, - "aria": false, - "maxExtent": 0, - "minExtent": 0, - "ticks": false, - "zindex": 0 - }, { "scale": "y", "orient": "left", diff --git a/examples/specs/bar_ranged_not_binned.vl.json b/examples/specs/bar_ranged_not_binned.vl.json new file mode 100644 index 0000000000..d8ca28ff02 --- /dev/null +++ b/examples/specs/bar_ranged_not_binned.vl.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": { + "values": [ + { "b": 28, "b2": 0}, { "b": 55, "b2": 0}, { "b": 43, "b2": 0}, + { "b": 91, "b2": 0}, { "b": 81, "b2": 0}, { "b": 53, "b2": 0}, + { "b": 19, "b2": 0}, { "b": 87, "b2": 0}, { "b": 52, "b2": 0} + ] + }, + "mark": {"type": "bar"}, + "encoding": { + "x": {"field": "b", "type": "quantitative"}, + "y": {"field": "b", "type": "quantitative"}, + "y2": {"field": "b2"} + } +} diff --git a/examples/specs/histogram_nonlinear.vl.json b/examples/specs/histogram_nonlinear.vl.json index ae56afc5be..6a291c340f 100644 --- a/examples/specs/histogram_nonlinear.vl.json +++ b/examples/specs/histogram_nonlinear.vl.json @@ -48,7 +48,7 @@ "title": "Distribution of Frame Render Time (ms)", "width": {"step": 40}, "height": 100, - "mark": {"type": "bar", "cornerRadiusEnd": 0}, + "mark": {"type": "bar", "cornerRadiusEnd": 0, "orient": "vertical"}, "encoding": { "x": { "title": "", diff --git a/examples/specs/layer_cumulative_histogram.vl.json b/examples/specs/layer_cumulative_histogram.vl.json index 2aa5682c7d..d7e684a241 100644 --- a/examples/specs/layer_cumulative_histogram.vl.json +++ b/examples/specs/layer_cumulative_histogram.vl.json @@ -19,7 +19,8 @@ "x": { "field": "bin_IMDB_Rating", "type": "quantitative", "scale": {"zero": false}, - "title": "IMDB Rating" + "title": "IMDB Rating", + "bin": "binned" }, "x2": {"field": "bin_IMDB_Rating_end"} }, diff --git a/examples/specs/normalized/layer_cumulative_histogram_normalized.vl.json b/examples/specs/normalized/layer_cumulative_histogram_normalized.vl.json index 66e87cd1d6..5814122d36 100644 --- a/examples/specs/normalized/layer_cumulative_histogram_normalized.vl.json +++ b/examples/specs/normalized/layer_cumulative_histogram_normalized.vl.json @@ -9,7 +9,8 @@ "field": "bin_IMDB_Rating", "type": "quantitative", "scale": {"zero": false}, - "title": "IMDB Rating" + "title": "IMDB Rating", + "bin": "binned" }, "x2": {"field": "bin_IMDB_Rating_end"}, "y": {"field": "Cumulative Count", "type": "quantitative"} @@ -22,7 +23,8 @@ "field": "bin_IMDB_Rating", "type": "quantitative", "scale": {"zero": false}, - "title": "IMDB Rating" + "title": "IMDB Rating", + "bin": "binned" }, "x2": {"field": "bin_IMDB_Rating_end"}, "y": {"field": "count", "type": "quantitative"} diff --git a/examples/specs/normalized/wheat_wages_normalized.vl.json b/examples/specs/normalized/wheat_wages_normalized.vl.json index df4b388ba9..1b293e59da 100644 --- a/examples/specs/normalized/wheat_wages_normalized.vl.json +++ b/examples/specs/normalized/wheat_wages_normalized.vl.json @@ -11,7 +11,8 @@ "x": { "type": "quantitative", "axis": {"tickCount": 5, "format": "d"}, - "field": "year" + "field": "year", + "bin": "binned" }, "x2": {"field": "year_end"} } @@ -75,7 +76,7 @@ }, { "data": {"url": "data/monarchs.json"}, - "mark": {"type": "bar", "stroke": "#000"}, + "mark": {"type": "rect", "stroke": "#000"}, "encoding": { "y": {"type": "quantitative", "axis": {"zindex": 1}, "field": "y"}, "x": { diff --git a/examples/specs/wheat_wages.vl.json b/examples/specs/wheat_wages.vl.json index 7eaf6de7c4..b79cad0bea 100644 --- a/examples/specs/wheat_wages.vl.json +++ b/examples/specs/wheat_wages.vl.json @@ -18,7 +18,7 @@ { "mark": {"type": "bar", "fill": "#aaa", "stroke": "#999"}, "encoding": { - "x": {"field": "year"}, + "x": {"field": "year", "bin":"binned"}, "x2": {"field": "year_end"}, "y": {"field": "wheat"} } @@ -74,7 +74,7 @@ { "calculate": "((!datum.commonwealth && datum.index % 2) ? -1: 1) * 2 + 95", "as": "offset" }, { "calculate": "95", "as": "y" } ], - "mark": {"type": "bar", "stroke": "#000"}, + "mark": {"type": "rect", "stroke": "#000"}, "encoding": { "x": {"field": "start"}, "x2": {"field": "end"}, diff --git a/src/compile/mark/init.ts b/src/compile/mark/init.ts index daa1646001..edd32312bd 100644 --- a/src/compile/mark/init.ts +++ b/src/compile/mark/init.ts @@ -123,18 +123,24 @@ function orient(mark: Mark, encoding: Encoding, specifiedOrient: Orienta return specifiedOrient; } - // If y is range and x is non-range, non-bin Q, y is likely a prebinned field + // If y is range and x is non-range, non-bin Q if (!x2) { if ((isFieldDef(x) && x.type === QUANTITATIVE && !isBinning(x.bin)) || isNumericDataDef(x)) { - return 'horizontal'; + if (isFieldDef(y) && isBinned(y.bin)) { + return 'horizontal'; + } } + return 'vertical'; } - // If x is range and y is non-range, non-bin Q, x is likely a prebinned field + // If x is range and y is non-range, non-bin Q if (!y2) { if ((isFieldDef(y) && y.type === QUANTITATIVE && !isBinning(y.bin)) || isNumericDataDef(y)) { - return 'vertical'; + if (isFieldDef(x) && isBinned(x.bin)) { + return 'vertical'; + } } + return 'horizontal'; } } diff --git a/test/compile/mark/bar.test.ts b/test/compile/mark/bar.test.ts index 7c7d354843..29fabebecd 100644 --- a/test/compile/mark/bar.test.ts +++ b/test/compile/mark/bar.test.ts @@ -43,9 +43,9 @@ describe('Mark: Bar', () => { expect(props.height).toBeUndefined(); }); - it('should draw vertical bar, with y from zero to field value and bar with quantitative x, x2, and y', () => { - const x: PositionFieldDef = {field: 'bin_start', type: 'quantitative'}; - const x2: SecondaryFieldDef = {field: 'bin_end'}; + it('should draw horizontal bar, with y from zero to field value and bar with quantitative x, x2, and y', () => { + const x: PositionFieldDef = {field: 'q_start', type: 'quantitative'}; + const x2: SecondaryFieldDef = {field: 'q_end'}; const model = parseUnitModelWithScaleAndLayoutSize({ data: {url: 'data/cars.json'}, mark: 'bar', @@ -56,11 +56,30 @@ describe('Mark: Bar', () => { } }); const props = bar.encodeEntry(model); - expect(props.x).toEqual({scale: 'x', field: 'bin_start'}); - expect(props.x2).toEqual({scale: 'x', field: 'bin_end'}); - expect(props.y).toEqual({scale: 'y', field: 'Acceleration'}); + expect(props.x).toEqual({scale: 'x', field: 'q_start'}); + expect(props.x2).toEqual({scale: 'x', field: 'q_end'}); + expect(props.yc).toEqual({scale: 'y', field: 'Acceleration'}); + expect(props.y).toBeUndefined(); + expect(props.height).toEqual({value: defaultBarConfig.continuousBandSize}); + }); + + it('should draw vertical bar, with y from zero to field value and bar with binned x, x2, and y', () => { + const x: PositionFieldDef = {field: 'bin_start', type: 'quantitative', bin: 'binned'}; + const x2: SecondaryFieldDef = {field: 'bin_end'}; + const model = parseUnitModelWithScaleAndLayoutSize({ + data: {url: 'data/cars.json'}, + mark: 'bar', + encoding: { + x, + x2, + y: {type: 'quantitative', field: 'Acceleration', aggregate: 'mean'} + } + }); + const props = bar.encodeEntry(model); + expect(props.x).toEqual({scale: 'x', field: 'bin_end'}); + expect(props.x2).toEqual({scale: 'x', field: 'bin_start', offset: 1}); + expect(props.y).toEqual({scale: 'y', field: 'mean_Acceleration'}); expect(props.y2).toEqual({scale: 'y', value: 0}); - expect(props.height).toBeUndefined(); }); it('should draw vertical bar, with y from zero to field value and with band value for x/width when domain that includes zero is specified', () => { @@ -181,8 +200,8 @@ describe('Mark: Bar', () => { }); }); - it('should draw horizontal bar, with y from zero to field value and bar with quantitative x, x2, and y', () => { - const y: PositionFieldDef = {field: 'bin_start', type: 'quantitative'}; + it('should draw vertical bar, with y from zero to field value and bar with binned y, y2, and x', () => { + const y: PositionFieldDef = {field: 'bin_start', type: 'quantitative', bin: 'binned'}; const y2: SecondaryFieldDef = {field: 'bin_end'}; const model = parseUnitModelWithScaleAndLayoutSize({ data: {url: 'data/cars.json'}, @@ -190,15 +209,34 @@ describe('Mark: Bar', () => { encoding: { y, y2, - x: {type: 'quantitative', field: 'Acceleration'} + x: {type: 'quantitative', field: 'Acceleration', aggregate: 'mean'} } }); const props = bar.encodeEntry(model); - expect(props.y).toEqual({scale: 'y', field: 'bin_start'}); - expect(props.y2).toEqual({scale: 'y', field: 'bin_end'}); - expect(props.x).toEqual({scale: 'x', field: 'Acceleration'}); + expect(props.y).toEqual({scale: 'y', field: 'bin_end', offset: 1}); + expect(props.y2).toEqual({scale: 'y', field: 'bin_start'}); + expect(props.x).toEqual({scale: 'x', field: 'mean_Acceleration'}); expect(props.x2).toEqual({scale: 'x', value: 0}); - expect(props.height).toBeUndefined(); + }); + + it('should draw horizontal bar, with y from zero to field value and bar with quantitative y, y2, and x', () => { + const y: PositionFieldDef = {field: 'q_start', type: 'quantitative'}; + const y2: SecondaryFieldDef = {field: 'q_end'}; + const model = parseUnitModelWithScaleAndLayoutSize({ + data: {url: 'data/cars.json'}, + mark: 'bar', + encoding: { + y, + y2, + x: {type: 'quantitative', field: 'Acceleration'} + } + }); + const props = bar.encodeEntry(model); + expect(props.y).toEqual({scale: 'y', field: 'q_start'}); + expect(props.y2).toEqual({scale: 'y', field: 'q_end'}); + expect(props.xc).toEqual({scale: 'x', field: 'Acceleration'}); + expect(props.x).toBeUndefined(); + expect(props.width).toEqual({value: defaultBarConfig.continuousBandSize}); }); describe('simple horizontal with point scale', () => { diff --git a/test/compile/mark/init.test.ts b/test/compile/mark/init.test.ts index ae1ad16164..11556576cf 100644 --- a/test/compile/mark/init.test.ts +++ b/test/compile/mark/init.test.ts @@ -383,6 +383,46 @@ describe('compile/mark/init', () => { expect(model.markDef.orient).toBe('horizontal'); }); + it('should return correct orient for bar with horizontal un-binned data', () => { + const model = parseUnitModelWithScaleAndLayoutSize({ + mark: 'bar', + encoding: { + x: { + field: 'q_start', + type: 'quantitative' + }, + x2: { + field: 'q_end' + }, + y: { + field: 'count', + type: 'quantitative' + } + } + }); + expect(model.markDef.orient).toBe('horizontal'); + }); + + it('should return correct orient for bar with vertical un-binned data', () => { + const model = parseUnitModelWithScaleAndLayoutSize({ + mark: 'bar', + encoding: { + y: { + field: 'q_start', + type: 'quantitative' + }, + y2: { + field: 'q_end' + }, + x: { + field: 'count', + type: 'quantitative' + } + } + }); + expect(model.markDef.orient).toBe('vertical'); + }); + it('should return correct orient for area with vertical binned data', () => { const model = parseUnitModelWithScaleAndLayoutSize({ mark: 'area',