From ee63189ce47ae4b2a899bffd7e2b8b274a208743 Mon Sep 17 00:00:00 2001 From: Dominik Moritz Date: Mon, 16 Aug 2021 21:43:59 -0400 Subject: [PATCH] fix: resolve theta to independent by default for faceted charts (#7563) * feat: resolve theta to independent for faceted chars * docs: document resolve for theta in facets * feat: don't share theta and radius in concat add tests * chore: update examples [CI] Co-authored-by: GitHub Actions Bot --- examples/compiled/arc_facet.png | Bin 0 -> 22903 bytes examples/compiled/arc_facet.svg | 1 + examples/compiled/arc_facet.vg.json | 132 ++++++++++++++++++ examples/compiled/arc_params.vg.json | 18 +-- examples/specs/arc_facet.vl.json | 13 ++ .../normalized/arc_facet_normalized.vl.json | 13 ++ site/docs/mark/arc.md | 6 + src/compile/resolve.ts | 6 +- test/compile/resolve.test.ts | 31 +++- 9 files changed, 205 insertions(+), 15 deletions(-) create mode 100644 examples/compiled/arc_facet.png create mode 100644 examples/compiled/arc_facet.svg create mode 100644 examples/compiled/arc_facet.vg.json create mode 100644 examples/specs/arc_facet.vl.json create mode 100644 examples/specs/normalized/arc_facet_normalized.vl.json diff --git a/examples/compiled/arc_facet.png b/examples/compiled/arc_facet.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdefdc831125e1d8ed3d5c701f31c10f1a0eef1 GIT binary patch literal 22903 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 literal 0 HcmV?d00001 diff --git a/examples/compiled/arc_facet.svg b/examples/compiled/arc_facet.svg new file mode 100644 index 0000000000..2627fb5bde --- /dev/null +++ b/examples/compiled/arc_facet.svg @@ -0,0 +1 @@ +year19311932CrookstonDuluthGrand RapidsMorrisUniversity FarmWasecasite \ No newline at end of file diff --git a/examples/compiled/arc_facet.vg.json b/examples/compiled/arc_facet.vg.json new file mode 100644 index 0000000000..358c80290f --- /dev/null +++ b/examples/compiled/arc_facet.vg.json @@ -0,0 +1,132 @@ +{ + "$schema": "https://vega.github.io/schema/vega/v5.json", + "background": "white", + "padding": 5, + "data": [ + { + "name": "source_0", + "url": "data/barley.json", + "format": {"type": "json"}, + "transform": [ + { + "type": "aggregate", + "groupby": ["site", "year"], + "ops": ["sum"], + "fields": ["yield"], + "as": ["sum_yield"] + }, + { + "type": "stack", + "groupby": ["year"], + "field": "sum_yield", + "sort": {"field": ["site"], "order": ["ascending"]}, + "as": ["sum_yield_start", "sum_yield_end"], + "offset": "zero" + }, + { + "type": "filter", + "expr": "isValid(datum[\"sum_yield\"]) && isFinite(+datum[\"sum_yield\"])" + } + ] + }, + { + "name": "column_domain", + "source": "source_0", + "transform": [{"type": "aggregate", "groupby": ["year"]}] + } + ], + "signals": [ + {"name": "child_width", "value": 200}, + {"name": "child_height", "value": 200} + ], + "layout": { + "padding": 20, + "offset": {"columnTitle": 10}, + "columns": {"signal": "length(data('column_domain'))"}, + "bounds": "full", + "align": "all" + }, + "marks": [ + { + "name": "column-title", + "type": "group", + "role": "column-title", + "title": {"text": "year", "style": "guide-title", "offset": 10} + }, + { + "name": "column_header", + "type": "group", + "role": "column-header", + "from": {"data": "column_domain"}, + "sort": {"field": "datum[\"year\"]", "order": "ascending"}, + "title": { + "text": { + "signal": "isValid(parent[\"year\"]) ? parent[\"year\"] : \"\"+parent[\"year\"]" + }, + "style": "guide-label", + "frame": "group", + "offset": 10 + }, + "encode": {"update": {"width": {"signal": "child_width"}}} + }, + { + "name": "cell", + "type": "group", + "style": "cell", + "from": { + "facet": {"name": "facet", "data": "source_0", "groupby": ["year"]} + }, + "sort": {"field": ["datum[\"year\"]"], "order": ["ascending"]}, + "encode": { + "update": { + "width": {"signal": "child_width"}, + "height": {"signal": "child_height"}, + "stroke": {"value": null} + } + }, + "marks": [ + { + "name": "child_marks", + "type": "arc", + "style": ["arc"], + "from": {"data": "facet"}, + "encode": { + "update": { + "fill": {"scale": "color", "field": "site"}, + "description": { + "signal": "\"Sum of yield: \" + (format(datum[\"sum_yield\"], \"\")) + \"; site: \" + (isValid(datum[\"site\"]) ? datum[\"site\"] : \"\"+datum[\"site\"])" + }, + "x": {"signal": "child_width", "mult": 0.5}, + "y": {"signal": "child_height", "mult": 0.5}, + "outerRadius": {"signal": "min(child_width,child_height)/2"}, + "innerRadius": {"value": 0}, + "startAngle": {"scale": "child_theta", "field": "sum_yield_end"}, + "endAngle": {"scale": "child_theta", "field": "sum_yield_start"} + } + } + } + ], + "scales": [ + { + "name": "child_theta", + "type": "linear", + "domain": { + "data": "facet", + "fields": ["sum_yield_start", "sum_yield_end"] + }, + "range": [0, 6.283185307179586], + "zero": true + } + ] + } + ], + "scales": [ + { + "name": "color", + "type": "ordinal", + "domain": {"data": "source_0", "field": "site", "sort": true}, + "range": "category" + } + ], + "legends": [{"fill": "color", "symbolType": "circle", "title": "site"}] +} diff --git a/examples/compiled/arc_params.vg.json b/examples/compiled/arc_params.vg.json index 4bd4143459..ae235dc7d8 100644 --- a/examples/compiled/arc_params.vg.json +++ b/examples/compiled/arc_params.vg.json @@ -142,8 +142,8 @@ "y": {"signal": "height", "mult": 0.5}, "outerRadius": {"signal": "radius"}, "innerRadius": {"signal": "radius2"}, - "startAngle": {"scale": "theta", "field": "value_end"}, - "endAngle": {"scale": "theta", "field": "value_start"} + "startAngle": {"scale": "concat_1_theta", "field": "value_end"}, + "endAngle": {"scale": "concat_1_theta", "field": "value_start"} } } } @@ -151,18 +151,18 @@ } ], "scales": [ - { - "name": "theta", - "type": "linear", - "domain": {"data": "data_0", "fields": ["value_start", "value_end"]}, - "range": [0, 6.283185307179586], - "zero": true - }, { "name": "color", "type": "ordinal", "domain": {"data": "data_0", "field": "category", "sort": true}, "range": "category" + }, + { + "name": "concat_1_theta", + "type": "linear", + "domain": {"data": "data_0", "fields": ["value_start", "value_end"]}, + "range": [0, 6.283185307179586], + "zero": true } ], "legends": [{"fill": "color", "symbolType": "circle", "title": "category"}], diff --git a/examples/specs/arc_facet.vl.json b/examples/specs/arc_facet.vl.json new file mode 100644 index 0000000000..d2f71eb7a2 --- /dev/null +++ b/examples/specs/arc_facet.vl.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": {"url": "data/barley.json"}, + "mark": "arc", + "encoding": { + "column": {"field": "year"}, + "theta": {"field": "yield", "type": "quantitative", "aggregate": "sum"}, + "color": {"field": "site", "type": "nominal"} + }, + "view": { + "stroke": null + } +} diff --git a/examples/specs/normalized/arc_facet_normalized.vl.json b/examples/specs/normalized/arc_facet_normalized.vl.json new file mode 100644 index 0000000000..ae6f196738 --- /dev/null +++ b/examples/specs/normalized/arc_facet_normalized.vl.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "data": {"url": "data/barley.json"}, + "facet": {"column": {"field": "year"}}, + "spec": { + "view": {"stroke": null}, + "mark": "arc", + "encoding": { + "theta": {"field": "yield", "type": "quantitative", "aggregate": "sum"}, + "color": {"field": "site", "type": "nominal"} + } + } +} \ No newline at end of file diff --git a/site/docs/mark/arc.md b/site/docs/mark/arc.md index 582cf305bf..54017f28e3 100644 --- a/site/docs/mark/arc.md +++ b/site/docs/mark/arc.md @@ -83,3 +83,9 @@ You can also add a text layer to add labels to a pie chart. The `arc` property of the top-level [`config`](config.html) object sets the default properties for all arc marks. If [mark property encoding channels](encoding.html#mark-prop) are specified for marks, these config values will be overridden. The arc config can contain any [arc mark properties](#properties) (except `type`, `style`, and `clip`). + +## Faceted Pie Charts + +By default, the theta channel in faceted charts [resolves](resolve.html) to independent scales so that the ratios are comparable. + + diff --git a/src/compile/resolve.ts b/src/compile/resolve.ts index 23de0f1c39..a45e8460f6 100644 --- a/src/compile/resolve.ts +++ b/src/compile/resolve.ts @@ -4,10 +4,12 @@ import {Resolve, ResolveMode} from '../resolve'; import {isConcatModel, isFacetModel, isLayerModel, Model} from './model'; export function defaultScaleResolve(channel: ScaleChannel, model: Model): ResolveMode { - if (isLayerModel(model) || isFacetModel(model)) { + if (isFacetModel(model)) { + return channel === 'theta' ? 'independent' : 'shared'; + } else if (isLayerModel(model)) { return 'shared'; } else if (isConcatModel(model)) { - return isXorY(channel) ? 'independent' : 'shared'; + return isXorY(channel) || channel === 'theta' || channel === 'radius' ? 'independent' : 'shared'; } /* istanbul ignore next: should never reach here. */ throw new Error('invalid model type for resolve'); diff --git a/test/compile/resolve.test.ts b/test/compile/resolve.test.ts index f91278273c..24e2d6211a 100644 --- a/test/compile/resolve.test.ts +++ b/test/compile/resolve.test.ts @@ -9,6 +9,10 @@ describe('compile/resolve', () => { layer: [] }); expect(defaultScaleResolve('x', model)).toBe('shared'); + expect(defaultScaleResolve('y', model)).toBe('shared'); + expect(defaultScaleResolve('color', model)).toBe('shared'); + expect(defaultScaleResolve('theta', model)).toBe('shared'); + expect(defaultScaleResolve('radius', model)).toBe('shared'); }); it('shares scales for facet model by default.', () => { @@ -19,23 +23,39 @@ describe('compile/resolve', () => { spec: {mark: 'point', encoding: {}} }); expect(defaultScaleResolve('x', model)).toBe('shared'); + expect(defaultScaleResolve('y', model)).toBe('shared'); + expect(defaultScaleResolve('color', model)).toBe('shared'); + expect(defaultScaleResolve('radius', model)).toBe('shared'); + }); + + it('separates theta scales for facet model by default.', () => { + const model = parseFacetModel({ + facet: { + row: {field: 'a', type: 'nominal'} + }, + spec: {mark: 'arc', encoding: {}} + }); + expect(defaultScaleResolve('theta', model)).toBe('independent'); }); - it('separates xy scales for concat model by default.', () => { + it('separates x, y, theta, and radius scales for concat model by default.', () => { const model = parseConcatModel({ hconcat: [] }); expect(defaultScaleResolve('x', model)).toBe('independent'); + expect(defaultScaleResolve('y', model)).toBe('independent'); + expect(defaultScaleResolve('theta', model)).toBe('independent'); + expect(defaultScaleResolve('radius', model)).toBe('independent'); }); - it('shares non-xy scales for concat model by default.', () => { + it('shares non-positional scales for concat model by default.', () => { const model = parseConcatModel({ hconcat: [] }); expect(defaultScaleResolve('color', model)).toBe('shared'); }); - it('separates xy scales for repeat model by default.', () => { + it('separates x, y, theta, and radius scales for repeat model by default.', () => { const model = parseModel({ repeat: { row: ['a', 'b'] @@ -49,9 +69,12 @@ describe('compile/resolve', () => { } }); expect(defaultScaleResolve('x', model)).toBe('independent'); + expect(defaultScaleResolve('y', model)).toBe('independent'); + expect(defaultScaleResolve('theta', model)).toBe('independent'); + expect(defaultScaleResolve('radius', model)).toBe('independent'); }); - it('shares non-xy scales for repeat model by default.', () => { + it('shares non-positional scales for repeat model by default.', () => { const model = parseModel({ repeat: { row: ['a', 'b']