From c0c7b6b4ef126e138b48990366b24ae7d713dafe Mon Sep 17 00:00:00 2001 From: Kanit Wongsuphasawat Date: Tue, 27 Aug 2024 19:58:54 -0700 Subject: [PATCH] fix: make 1D tick mark responsive to width/height (#9411) ## PR Description See fixed example + relevant unit tests --------- Co-authored-by: GitHub Actions Bot --- .../compiled/bar_tooltip_aggregate.vg.json | 2 +- examples/compiled/bar_tooltip_groupby.vg.json | 2 +- .../boxplot_1D_horizontal_custom_mark.vg.json | 4 +- .../compiled/errorbar_2d_vertical_ticks.png | Bin 13189 -> 15334 bytes .../compiled/errorbar_2d_vertical_ticks.svg | 2 +- .../errorbar_2d_vertical_ticks.vg.json | 4 +- examples/compiled/facet_bullet.vg.json | 2 +- examples/compiled/tick_dot.vg.json | 2 +- examples/compiled/tick_sort.vg.json | 2 +- .../compiled/tick_strip_1D_with_height.png | Bin 0 -> 4620 bytes .../compiled/tick_strip_1D_with_height.svg | 1 + .../tick_strip_1D_with_height.vg.json | 78 ++++++++++++++++++ .../specs/tick_strip_1D_with_height.vl.json | 9 ++ src/compile/mark/tick.ts | 8 +- test/compile/mark/tick.test.ts | 28 +++++++ 15 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 examples/compiled/tick_strip_1D_with_height.png create mode 100644 examples/compiled/tick_strip_1D_with_height.svg create mode 100644 examples/compiled/tick_strip_1D_with_height.vg.json create mode 100644 examples/specs/tick_strip_1D_with_height.vl.json diff --git a/examples/compiled/bar_tooltip_aggregate.vg.json b/examples/compiled/bar_tooltip_aggregate.vg.json index f4b9af25c1..3abf49fbc0 100644 --- a/examples/compiled/bar_tooltip_aggregate.vg.json +++ b/examples/compiled/bar_tooltip_aggregate.vg.json @@ -41,7 +41,7 @@ }, "xc": {"signal": "width", "mult": 0.5}, "yc": {"scale": "y", "field": "mean_data"}, - "width": {"value": 15}, + "width": {"signal": "(1 - 0.25) * width"}, "height": {"value": 1} } } diff --git a/examples/compiled/bar_tooltip_groupby.vg.json b/examples/compiled/bar_tooltip_groupby.vg.json index d024f77b49..70a15cebcb 100644 --- a/examples/compiled/bar_tooltip_groupby.vg.json +++ b/examples/compiled/bar_tooltip_groupby.vg.json @@ -43,7 +43,7 @@ }, "xc": {"signal": "width", "mult": 0.5}, "yc": {"scale": "y", "field": "mean_data"}, - "width": {"value": 15}, + "width": {"signal": "(1 - 0.25) * width"}, "height": {"value": 1} } } diff --git a/examples/compiled/boxplot_1D_horizontal_custom_mark.vg.json b/examples/compiled/boxplot_1D_horizontal_custom_mark.vg.json index b46b4f4f66..6822bb72b3 100644 --- a/examples/compiled/boxplot_1D_horizontal_custom_mark.vg.json +++ b/examples/compiled/boxplot_1D_horizontal_custom_mark.vg.json @@ -213,7 +213,7 @@ }, "xc": {"scale": "x", "field": "lower_whisker_Body Mass (g)"}, "yc": {"signal": "height", "mult": 0.5}, - "height": {"value": 15}, + "height": {"signal": "(1 - 0.25) * height"}, "width": {"value": 1} } } @@ -233,7 +233,7 @@ }, "xc": {"scale": "x", "field": "upper_whisker_Body Mass (g)"}, "yc": {"signal": "height", "mult": 0.5}, - "height": {"value": 15}, + "height": {"signal": "(1 - 0.25) * height"}, "width": {"value": 1} } } diff --git a/examples/compiled/errorbar_2d_vertical_ticks.png b/examples/compiled/errorbar_2d_vertical_ticks.png index 6263d0475157e851fa63771c1314ae462b9d3662..78ad1fcbeba876d534d8c7125c00ef794cd99727 100644 GIT binary patch literal 15334 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 diff --git a/examples/compiled/errorbar_2d_vertical_ticks.svg b/examples/compiled/errorbar_2d_vertical_ticks.svg index 6de06f9260..f1d06c2fb4 100644 --- a/examples/compiled/errorbar_2d_vertical_ticks.svg +++ b/examples/compiled/errorbar_2d_vertical_ticks.svg @@ -1 +1 @@ -197019721974197619781980Year (year)1520253035Miles per Gallon (95% CIs) \ No newline at end of file +197019721974197619781980Year (year)1520253035Miles per Gallon (95% CIs) \ No newline at end of file diff --git a/examples/compiled/errorbar_2d_vertical_ticks.vg.json b/examples/compiled/errorbar_2d_vertical_ticks.vg.json index 35c3dd8558..eb3bcf8ccd 100644 --- a/examples/compiled/errorbar_2d_vertical_ticks.vg.json +++ b/examples/compiled/errorbar_2d_vertical_ticks.vg.json @@ -71,7 +71,7 @@ }, "xc": {"scale": "x", "field": "year_Year"}, "yc": {"scale": "y", "field": "lower_Miles_per_Gallon"}, - "width": {"value": 15}, + "width": {"signal": "(1 - 0.25) * width"}, "height": {"value": 1} } } @@ -91,7 +91,7 @@ }, "xc": {"scale": "x", "field": "year_Year"}, "yc": {"scale": "y", "field": "upper_Miles_per_Gallon"}, - "width": {"value": 15}, + "width": {"signal": "(1 - 0.25) * width"}, "height": {"value": 1} } } diff --git a/examples/compiled/facet_bullet.vg.json b/examples/compiled/facet_bullet.vg.json index d594fea208..353bcc5a24 100644 --- a/examples/compiled/facet_bullet.vg.json +++ b/examples/compiled/facet_bullet.vg.json @@ -439,7 +439,7 @@ }, "xc": {"scale": "child_x", "field": "markers\\.0"}, "yc": {"signal": "child_height", "mult": 0.5}, - "height": {"value": 15}, + "height": {"signal": "(1 - 0.25) * child_height"}, "width": {"value": 2} } } diff --git a/examples/compiled/tick_dot.vg.json b/examples/compiled/tick_dot.vg.json index d8b575c0b5..1ee300c2df 100644 --- a/examples/compiled/tick_dot.vg.json +++ b/examples/compiled/tick_dot.vg.json @@ -34,7 +34,7 @@ }, "xc": {"scale": "x", "field": "precipitation"}, "yc": {"signal": "height", "mult": 0.5}, - "height": {"value": 15}, + "height": {"signal": "(1 - 0.25) * height"}, "width": {"value": 1} } } diff --git a/examples/compiled/tick_sort.vg.json b/examples/compiled/tick_sort.vg.json index e54fb4aed0..05a2fd5cfb 100644 --- a/examples/compiled/tick_sort.vg.json +++ b/examples/compiled/tick_sort.vg.json @@ -34,7 +34,7 @@ }, "xc": {"scale": "x", "field": "Horsepower"}, "yc": {"signal": "height", "mult": 0.5}, - "height": {"value": 15}, + "height": {"signal": "(1 - 0.25) * height"}, "width": {"value": 1} } } diff --git a/examples/compiled/tick_strip_1D_with_height.png b/examples/compiled/tick_strip_1D_with_height.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba419d02de9c8df841b78ee19893399f8de0f9e GIT binary patch literal 4620 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 \ No newline at end of file diff --git a/examples/compiled/tick_strip_1D_with_height.vg.json b/examples/compiled/tick_strip_1D_with_height.vg.json new file mode 100644 index 0000000000..921930cb87 --- /dev/null +++ b/examples/compiled/tick_strip_1D_with_height.vg.json @@ -0,0 +1,78 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "background": "white", + "padding": 5, + "width": 200, + "height": 200, + "style": "cell", + "data": [ + { + "name": "source_0", + "url": "data/cars.json", + "format": {"type": "json"}, + "transform": [ + { + "type": "filter", + "expr": "isValid(datum[\"Horsepower\"]) && isFinite(+datum[\"Horsepower\"])" + } + ] + } + ], + "marks": [ + { + "name": "marks", + "type": "rect", + "style": ["tick"], + "from": {"data": "source_0"}, + "encode": { + "update": { + "opacity": {"value": 0.7}, + "fill": {"value": "#4c78a8"}, + "ariaRoleDescription": {"value": "tick"}, + "description": { + "signal": "\"Horsepower: \" + (format(datum[\"Horsepower\"], \"\"))" + }, + "xc": {"scale": "x", "field": "Horsepower"}, + "yc": {"signal": "height", "mult": 0.5}, + "height": {"signal": "(1 - 0.25) * height"}, + "width": {"value": 1} + } + } + } + ], + "scales": [ + { + "name": "x", + "type": "linear", + "domain": {"data": "source_0", "field": "Horsepower"}, + "range": [0, {"signal": "width"}], + "nice": true, + "zero": true + } + ], + "axes": [ + { + "scale": "x", + "orient": "bottom", + "grid": true, + "tickCount": {"signal": "ceil(width/40)"}, + "domain": false, + "labels": false, + "aria": false, + "maxExtent": 0, + "minExtent": 0, + "ticks": false, + "zindex": 0 + }, + { + "scale": "x", + "orient": "bottom", + "grid": false, + "title": "Horsepower", + "labelFlush": true, + "labelOverlap": true, + "tickCount": {"signal": "ceil(width/40)"}, + "zindex": 0 + } + ] +} diff --git a/examples/specs/tick_strip_1D_with_height.vl.json b/examples/specs/tick_strip_1D_with_height.vl.json new file mode 100644 index 0000000000..1663787c40 --- /dev/null +++ b/examples/specs/tick_strip_1D_with_height.vl.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": {"url": "data/cars.json"}, + "height": 200, + "mark": "tick", + "encoding": { + "x": {"field": "Horsepower", "type": "quantitative"} + } +} diff --git a/src/compile/mark/tick.ts b/src/compile/mark/tick.ts index 4b045b84ba..cf0654f657 100644 --- a/src/compile/mark/tick.ts +++ b/src/compile/mark/tick.ts @@ -1,5 +1,4 @@ import {isNumber} from 'vega-util'; -import {getViewConfigDiscreteStep} from '../../config'; import {isVgRangeStep, VgValueRef} from '../../vega.schema'; import {exprFromSignalRefOrValue, getMarkPropOrConfig, signalOrValueRef} from '../common'; import {UnitModel} from '../unit'; @@ -51,7 +50,6 @@ function defaultSize(model: UnitModel): VgValueRef { // Use offset scale if exists const scale = model.getScaleComponent(offsetScaleChannel) || model.getScaleComponent(positionChannel); - const scaleName = model.scaleName(offsetScaleChannel) || model.scaleName(positionChannel); const markPropOrConfig = getMarkPropOrConfig('size', markDef, config, {vgChannel: vgSizeChannel}) ?? config.tick.bandSize; @@ -59,18 +57,18 @@ function defaultSize(model: UnitModel): VgValueRef { if (markPropOrConfig !== undefined) { return signalOrValueRef(markPropOrConfig); } else if (scale?.get('type') === 'band') { + const scaleName = model.scaleName(offsetScaleChannel) || model.scaleName(positionChannel); return {scale: scaleName, band: 1}; } const scaleRange = scale?.get('range'); const {tickBandPaddingInner} = config.scale; - const step = - scaleRange && isVgRangeStep(scaleRange) ? scaleRange.step : getViewConfigDiscreteStep(config.view, vgSizeChannel); + const step = scaleRange && isVgRangeStep(scaleRange) ? scaleRange.step : model[vgSizeChannel]; if (isNumber(step) && isNumber(tickBandPaddingInner)) { return {value: step * (1 - tickBandPaddingInner)}; } else { - return {signal: `${exprFromSignalRefOrValue(tickBandPaddingInner)} * ${exprFromSignalRefOrValue(step)}`}; + return {signal: `(1 - ${exprFromSignalRefOrValue(tickBandPaddingInner)}) * ${exprFromSignalRefOrValue(step)}`}; } } diff --git a/test/compile/mark/tick.test.ts b/test/compile/mark/tick.test.ts index fd4aa2468c..bbc4e57761 100644 --- a/test/compile/mark/tick.test.ts +++ b/test/compile/mark/tick.test.ts @@ -206,4 +206,32 @@ describe('Mark: Tick', () => { expect(props.height).toEqual({field: 'Acceleration', scale: SIZE}); }); }); + + describe('vertical ticks without Y', () => { + const model = parseUnitModelWithScaleAndLayoutSize({ + mark: 'tick', + encoding: { + x: {field: 'Horsepower', type: 'quantitative'} + }, + data: {url: 'data/cars.json'} + }); + const props = tick.encodeEntry(model); + it('sets mark height to (1-tickBandPaddingInner) * plot_height', () => { + expect(props.height).toEqual({signal: '(1 - 0.25) * height'}); + }); + }); + + describe('horizontal ticks without X', () => { + const model = parseUnitModelWithScaleAndLayoutSize({ + mark: 'tick', + encoding: { + y: {field: 'Horsepower', type: 'quantitative'} + }, + data: {url: 'data/cars.json'} + }); + const props = tick.encodeEntry(model); + it('sets mark width to (1-tickBandPaddingInner) * plot_width', () => { + expect(props.width).toEqual({signal: '(1 - 0.25) * width'}); + }); + }); });