Stacked bar with JUnit style records - vega

I have a dataset exported from a JUnitXML file and I would like to create a simple visualisation using Vega-lite of a stacked bar for each test suite. The problem is that in JUnit style you don't get a value for "success" but instead you get a "tests" fields that is the sum of all types of tests.
So far I've just naively exported as tidy data and then mapped to x, y and color.
Current visualisation
Vega-editor
{
"$schema": "https://vega.github.io/schema/vega-lite/v4.json",
"data": {"name": "results"},
"mark": "bar",
"encoding": {
"y": {"field": "name", "type": "nominal"},
"x": {"aggregate": "sum", "field": "count", "type": "quantitative", "stack": "normalize"},
"color": {"field": "type"}
},
"datasets": {
"results": [
{"name": "test_suite_0", "type": "tests", "count": 10},
{"name": "test_suite_1", "type": "tests", "count": 10},
{"name": "test_suite_2", "type": "tests", "count": 10},
{"name": "test_suite_3", "type": "tests", "count": 10},
{"name": "test_suite_4", "type": "tests", "count": 10},
{"name": "general-test-suite", "type": "tests", "count": 10},
{"name": "test_suite_0", "type": "skipped", "count": 2},
{"name": "test_suite_1", "type": "skipped", "count": 2},
{"name": "test_suite_2", "type": "skipped", "count": 3},
{"name": "test_suite_3", "type": "skipped", "count": 4},
{"name": "test_suite_4", "type": "skipped", "count": 3},
{"name": "general-test-suite", "type": "skipped", "count": 1},
{"name": "test_suite_0", "type": "failures", "count": 3},
{"name": "test_suite_1", "type": "failures", "count": 2},
{"name": "test_suite_2", "type": "failures", "count": 0},
{"name": "test_suite_3", "type": "failures", "count": 2},
{"name": "test_suite_4", "type": "failures", "count": 3},
{"name": "general-test-suite", "type": "failures", "count": 3},
{"name": "test_suite_0", "type": "errors", "count": 4},
{"name": "test_suite_1", "type": "errors", "count": 4},
{"name": "test_suite_2", "type": "errors", "count": 4},
{"name": "test_suite_3", "type": "errors", "count": 1},
{"name": "test_suite_4", "type": "errors", "count": 4},
{"name": "general-test-suite", "type": "errors", "count": 2}
]
}
}
I would like to change the tests values for success, which should be the difference of tests-(sum of count of other fields grouped by name) but I have no clue about how to do it.

You could use an aggregate transform followed by a calculate transform; something like this (vega editor):
{
"data": {"name": "results"},
"transform": [
{
"aggregate": [
{"op": "sum", "field": "count", "as": "total"},
{"op": "max", "field": "count", "as": "tests"}
],
"groupby": ["name"]
},
{"calculate": "2 * datum.tests - datum.total", "as": "passed"}
],
"mark": "bar",
"encoding": {
"x": {"type": "quantitative", "field": "passed"},
"y": {"type": "nominal", "field": "name"}
},
"datasets": {
"results": [
{"count": 10, "name": "test_suite_0", "type": "tests"},
{"count": 10, "name": "test_suite_1", "type": "tests"},
{"count": 10, "name": "test_suite_2", "type": "tests"},
{"count": 10, "name": "test_suite_3", "type": "tests"},
{"count": 10, "name": "test_suite_4", "type": "tests"},
{"count": 10, "name": "general-test-suite", "type": "tests"},
{"count": 2, "name": "test_suite_0", "type": "skipped"},
{"count": 2, "name": "test_suite_1", "type": "skipped"},
{"count": 3, "name": "test_suite_2", "type": "skipped"},
{"count": 4, "name": "test_suite_3", "type": "skipped"},
{"count": 3, "name": "test_suite_4", "type": "skipped"},
{"count": 1, "name": "general-test-suite", "type": "skipped"},
{"count": 3, "name": "test_suite_0", "type": "failures"},
{"count": 2, "name": "test_suite_1", "type": "failures"},
{"count": 0, "name": "test_suite_2", "type": "failures"},
{"count": 2, "name": "test_suite_3", "type": "failures"},
{"count": 3, "name": "test_suite_4", "type": "failures"},
{"count": 3, "name": "general-test-suite", "type": "failures"},
{"count": 4, "name": "test_suite_0", "type": "errors"},
{"count": 4, "name": "test_suite_1", "type": "errors"},
{"count": 4, "name": "test_suite_2", "type": "errors"},
{"count": 1, "name": "test_suite_3", "type": "errors"},
{"count": 4, "name": "test_suite_4", "type": "errors"},
{"count": 2, "name": "general-test-suite", "type": "errors"}
]
}
}

I finally got the result I was after (and realised that it's not as pretty as I imagined it). I decided to pivot the columns, calculate the amount of "passed" per test suite and then fold again for easy plotting:
Vega-editor
{
"data": {"name": "results"},
"transform": [
{"pivot": "type", "groupby": ["name"], "value": "count"},
{
"calculate": "datum.tests - (datum.failures + datum.skipped + datum.errors)",
"as": "passed"
},
{
"fold": ["passed", "failures", "skipped", "errors"],
"as": ["type", "count"]
}
],
"mark": "bar",
"encoding": {
"x": {"aggregate": "sum", "type": "quantitative", "field": "count"},
"y": {"type": "nominal", "field": "name"},
"color": {
"type": "nominal",
"field": "type",
"sort": ["passed", "failures", "skipped", "errors"],
"scale": {"range": ["green", "red", "grey", "yellow"]}
},
"order": {"range": ["passed", "failures", "skipped", "errors"]}
},
"datasets": {
"results": [
{"count": 10, "name": "test_suite_0", "type": "tests"},
{"count": 10, "name": "test_suite_1", "type": "tests"},
{"count": 10, "name": "test_suite_2", "type": "tests"},
{"count": 10, "name": "test_suite_3", "type": "tests"},
{"count": 10, "name": "test_suite_4", "type": "tests"},
{"count": 10, "name": "general-test-suite", "type": "tests"},
{"count": 2, "name": "test_suite_0", "type": "skipped"},
{"count": 2, "name": "test_suite_1", "type": "skipped"},
{"count": 3, "name": "test_suite_2", "type": "skipped"},
{"count": 4, "name": "test_suite_3", "type": "skipped"},
{"count": 3, "name": "test_suite_4", "type": "skipped"},
{"count": 1, "name": "general-test-suite", "type": "skipped"},
{"count": 3, "name": "test_suite_0", "type": "failures"},
{"count": 2, "name": "test_suite_1", "type": "failures"},
{"count": 0, "name": "test_suite_2", "type": "failures"},
{"count": 2, "name": "test_suite_3", "type": "failures"},
{"count": 3, "name": "test_suite_4", "type": "failures"},
{"count": 3, "name": "general-test-suite", "type": "failures"},
{"count": 4, "name": "test_suite_0", "type": "errors"},
{"count": 4, "name": "test_suite_1", "type": "errors"},
{"count": 4, "name": "test_suite_2", "type": "errors"},
{"count": 1, "name": "test_suite_3", "type": "errors"},
{"count": 4, "name": "test_suite_4", "type": "errors"},
{"count": 2, "name": "general-test-suite", "type": "errors"}
]
}
}

Related

Labels on Rects in Vega Stacked Bar Chart

In the old vega-label documentation there is reference to a labeled stacked bar chart example. The example spec doesn’t work in the online Vega editor, throwing an error that a.map is not a function.
I am trying to do almost exactly what is referenced in the above example: create a vertically-stacked bar chart where each segment is labeled with its value. I have seen a few examples of this in Vega-Lite with layers, but how can it be achieved in Vega?
I’ve attempted to recreate the above spec using a group containing the rect mark and the text mark, but I’m not getting it right. I also see how to display the value as a tooltip on hover, but I’d like it displayed in the rectangle of each segment of the bar itself.
Ideally I would end up with a chart like this:
Here’s the spec I’ve been working with:
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "A basic stacked bar chart example.",
"width": 294,
"height": 200,
"padding": 5,
"autosize": {"type": "fit-x", "contains": "padding"},
"data": [
{
"name": "categories",
"values": [
{"y": 5, "c": 0, "name": "other"},
{"y": 7, "c": 1, "name": "corn"},
{"y": 22, "c": 2, "name": "pasture/hay"},
{"y": 31, "c": 3, "name": "developed"},
{"y": 35, "c": 4, "name": "forest"}
],
"transform": [
{
"type": "stack",
"field": "y"
}
]
}
],
"scales": [
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true, "zero": true,
"domain": {"data": "categories", "field": "y1"}
},
{
"name": "color",
"type": "ordinal",
"range": "category",
"domain": {"data": "categories", "field": "c"}
}
],
"axes": [
],
"marks": [
{
"name": "categoriesBars",
"type": "group",
"from": {"data": "categories"},
"zindex": 1,
"marks": [
{
"type": "rect",
"from": {"data": "categories"},
"encode": {
"enter": {
"x": {"value": 0},
"width": {"value": 294},
"y": {"scale": "y", "field": "y0"},
"y2": {"scale": "y", "field": "y1"},
"fill": {"scale": "color", "field": "c"}
},
"update": {
"fillOpacity": {"value": 1}
},
"hover": {
"fillOpacity": {"value": 0.5}
}
}
},
{
"type": "text",
"encode": {
"enter": {
"y": {"field": {"parent": "y"}},
"x": {"value": 130},
"fill": [
{"test": "contrast('white', datum.fill) > contrast('black', datum.fill)", "value": "white"},
{"value": "black"}
],
"align": {"value": "center"},
"baseline": {"value": "middle"},
"text": {"field": {"parent": "name"}}
}
}
}
]
}
]
}
Is this what you're after?
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "A basic stacked bar chart example.",
"width": 294,
"height": 200,
"padding": 5,
"autosize": {"type": "fit-x", "contains": "padding"},
"data": [
{
"name": "categories",
"values": [
{"y": 5, "c": 0, "name": "other"},
{"y": 7, "c": 1, "name": "corn"},
{"y": 22, "c": 2, "name": "pasture/hay"},
{"y": 31, "c": 3, "name": "developed"},
{"y": 35, "c": 4, "name": "forest"}
],
"transform": [{"type": "stack", "field": "y"}]
}
],
"scales": [
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": {"data": "categories", "field": "y1"}
},
{
"name": "color",
"type": "ordinal",
"range": {"scheme": "pastel2"},
"domain": {"data": "categories", "field": "c"}
}
],
"axes": [],
"marks": [
{
"name": "i",
"type": "rect",
"from": {"data": "categories"},
"encode": {
"enter": {
"x": {"value": 0},
"width": {"value": 294},
"y": {"scale": "y", "field": "y0"},
"y2": {"scale": "y", "field": "y1"},
"fill": {"scale": "color", "field": "c"}
},
"update": {"fillOpacity": {"value": 1}},
"hover": {"fillOpacity": {"value": 0.5}}
}
},
{
"type": "text",
"from": {"data": "i"},
"encode": {
"update": {
"y": {"field": "y"},
"dy": {"signal": "(datum.y2 - datum.y)/2"},
"x": {"signal": "width/2"},
"fill": [
{
"test": "contrast('white', datum.fill) > contrast('black', datum.fill)",
"value": "white"
},
{"value": "black"}
],
"align": {"value": "center"},
"baseline": {"value": "middle"},
"text": {"field": "datum.name"}
}
}
}
]
}

Stacked barchart in Vega

I am trying to make a stacked barchart in Vega and have hit a wall where I swear that my code should work, based on the several examples I've been cross referencing, but instead I keep getting perfect axes...with no bars.
The way it's supposed to work in this example is that Alamo's "Operations" "Debt" and "Below Cap" should stack, with State Average having the same categories of data stacked in the same order next to it. Both should sum to the same level (1). The transformed data looks to be in good shape, as the y0/y1 and order are correct.
I initially assumed the problem is in the marks section since that's where the bars are defined but I can't identify what the issue is there, so now I'm wondering if it's something else. But I don't know what else to try.
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "A stacked bar chart describing ad valorem taxes in Texas community college districts.",
"width": 300,
"height": 300,
"padding": 5,
"background": "white",
"style": "cell",
"data": [
{
"name": "source_0",
"values": [
{
"name": "Operations (MO)",
"amount": 0.1078,
"district": "Alamo",
"sort": 1,
"y0": 0,
"y1": 0.1078
},
{
"name": "Debt (IS)",
"amount": 0.0414,
"district": "Alamo",
"sort": 2,
"y0": 0.1078,
"y1": 0.1492
},
{
"name": "Below Cap",
"amount": 0.8508,
"district": "Alamo",
"sort": 3,
"y0": 0.1492,
"y1": 1
},
{
"name": "Operations (MO)",
"amount": 0.152,
"district": "State Average",
"sort": 1,
"y0": 0,
"y1": 0.152
},
{
"name": "Debt (IS)",
"amount": 0.027,
"district": "State Average",
"sort": 2,
"y0": 0.152,
"y1": 0.179
},
{
"name": "Below Cap",
"amount": 0.821,
"district": "State Average",
"sort": 3,
"y0": 0.179,
"y1": 1
}
],
"format": {"type": "json"},
"transform": [
{
"type": "stack",
"groupby": ["district"],
"sort": {"field": "sort"},
"field": "amount"
}
]
}
],
"scales": [
{
"name": "x",
"type": "band",
"range": "width",
"domain": {"data": "source_0", "field": "district"}
},
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": {"data": "source_0", "field": "y1"}
},
{
"name": "color",
"type": "ordinal",
"range": "category",
"domain": {"data": "source_0", "field": "name"}
}
],
"axes": [
{"orient": "bottom", "scale": "x", "zindex": 1},
{"orient": "left", "scale": "y", "zindex": 1}
],
"marks": [
{
"type": "rect",
"from": {"data": "source_0"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "district"},
"width": {"scale": "x", "band": 1},
"y": {"scale": "y", "field": "y1"},
"y2": {"scale": "y", "value": "y0"},
"fill": {"scale": "color", "field": "name"}
}
}
}
]
}
Change your y2 from value to field. Editor
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "A stacked bar chart describing ad valorem taxes in Texas community college districts.",
"width": 300,
"height": 300,
"padding": 5,
"background": "white",
"style": "cell",
"data": [
{
"name": "source_0",
"values": [
{
"name": "Operations (MO)",
"amount": 0.1078,
"district": "Alamo",
"sort": 1,
"y0": 0,
"y1": 0.1078
},
{
"name": "Debt (IS)",
"amount": 0.0414,
"district": "Alamo",
"sort": 2,
"y0": 0.1078,
"y1": 0.1492
},
{
"name": "Below Cap",
"amount": 0.8508,
"district": "Alamo",
"sort": 3,
"y0": 0.1492,
"y1": 1
},
{
"name": "Operations (MO)",
"amount": 0.152,
"district": "State Average",
"sort": 1,
"y0": 0,
"y1": 0.152
},
{
"name": "Debt (IS)",
"amount": 0.027,
"district": "State Average",
"sort": 2,
"y0": 0.152,
"y1": 0.179
},
{
"name": "Below Cap",
"amount": 0.821,
"district": "State Average",
"sort": 3,
"y0": 0.179,
"y1": 1
}
],
"format": {"type": "json"},
"transform": [
{
"type": "stack",
"groupby": ["district"],
"sort": {"field": "sort"},
"field": "amount"
}
]
}
],
"scales": [
{
"name": "x",
"type": "band",
"range": "width",
"domain": {"data": "source_0", "field": "district"}
},
{
"name": "y",
"type": "linear",
"range": "height",
"nice": true,
"zero": true,
"domain": {"data": "source_0", "field": "y1"}
},
{
"name": "color",
"type": "ordinal",
"range": "category",
"domain": {"data": "source_0", "field": "name"}
}
],
"axes": [
{"orient": "bottom", "scale": "x", "zindex": 1},
{"orient": "left", "scale": "y", "zindex": 1}
],
"marks": [
{
"type": "rect",
"from": {"data": "source_0"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "district"},
"width": {"scale": "x", "band": 1},
"y": {"scale": "y", "field": "y1"},
"y2": {"scale": "y", "field": "y0"},
"fill": {"scale": "color", "field": "name"}
}
}
}
]
}

Ordering of a faceted Bar-chart in Vega

I have a question about facet visualizations in vega.
I have a pretty similar problem as the nested bar char example.
Here I changed the order of the tuple values. as intended, the order in the visualization is changing to.
But I want the 3 facets ordered ascending for value "a".
I don't really understand, if there is a "scale" for the facets, or where to order them.
Second part would be to have an axes for the value "a" shown below/above the bar chart.
Hope someone can help me.
Greetings
Christian
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "A nested bar chart example, with bars grouped by category.",
"width": 300,
"padding": 5,
"autosize": "pad",
"signals": [
{
"name": "rangeStep", "value": 20,
"bind": {"input": "range", "min": 5, "max": 50, "step": 1}
},
{
"name": "innerPadding", "value": 0.1,
"bind": {"input": "range", "min": 0, "max": 0.7, "step": 0.01}
},
{
"name": "outerPadding", "value": 0.2,
"bind": {"input": "range", "min": 0, "max": 0.4, "step": 0.01}
},
{
"name": "height",
"update": "trellisExtent[1]"
}
],
"data": [
{
"name": "tuples",
"values": [
{"a": 1, "b": "b", "c": 4.4},
{"a": 0, "b": "c", "c": 5.1},
{"a": 0, "b": "a", "c": 6.3},
{"a": 0, "b": "a", "c": 4.2},
{"a": 0, "b": "b", "c": 6.8},
{"a": 2, "b": "b", "c": 3.5},
{"a": 2, "b": "c", "c": 6.2}
],
"transform": [
{
"type": "aggregate",
"groupby": ["a", "b"],
"fields": ["c"],
"ops": ["average"],
"as": ["c"]
}
]
},
{
"name": "trellis",
"source": "tuples",
"transform": [
{
"type": "aggregate",
"groupby": ["a"]
},
{
"type": "formula", "as": "span",
"expr": "rangeStep * bandspace(datum.count, innerPadding, outerPadding)"
},
{
"type": "stack",
"field": "span"
},
{
"type": "extent",
"field": "y1",
"signal": "trellisExtent"
}
]
}
],
"scales": [
{
"name": "xscale",
"domain": {"data": "tuples", "field": "c"},
"nice": true,
"zero": true,
"round": true,
"range": "width"
},
{
"name": "color",
"type": "ordinal",
"range": "category",
"domain": {"data": "trellis", "field": "a"}
}
],
"axes": [
{ "orient": "bottom", "scale": "xscale", "domain": true }
],
"marks": [
{
"type": "group",
"from": {
"data": "trellis",
"facet": {
"name": "faceted_tuples",
"data": "tuples",
"groupby": "a"
}
},
"encode": {
"enter": {
"x": {"value": 0},
"width": {"signal": "width"}
},
"update": {
"y": {"field": "y0"},
"y2": {"field": "y1"}
}
},
"scales": [
{
"name": "yscale",
"type": "band",
"paddingInner": {"signal": "innerPadding"},
"paddingOuter": {"signal": "outerPadding"},
"round": true,
"domain": {"data": "faceted_tuples", "field": "b"},
"range": {"step": {"signal": "rangeStep"}}
}
],
"axes": [
{ "orient": "left", "scale": "yscale",
"ticks": false, "domain": false, "labelPadding": 4 }
],
"marks": [
{
"type": "rect",
"from": {"data": "faceted_tuples"},
"encode": {
"enter": {
"x": {"value": 0},
"x2": {"scale": "xscale", "field": "c"},
"fill": {"scale": "color", "field": "a"},
"strokeWidth": {"value": 2}
},
"update": {
"y": {"scale": "yscale", "field": "b"},
"height": {"scale": "yscale", "band": 1},
"stroke": {"value": null},
"zindex": {"value": 0}
},
"hover": {
"stroke": {"value": "firebrick"},
"zindex": {"value": 1}
}
}
}
]
}
]
}

Calculations in vega-lite

is there a way to dynamically calculate growth rates in Vega-Lite.
For example:
[
{"date": "1/1/2020", "b": 27},
{"date": "1/2/2020", "b": 30},
{"date": "1/3/2020", "b": 33}
]
How could I create data (and a chart) that shows the daily +3 (or the ~+10%)?
Edit: Thanks for the answer, #jakevdp.
Should have outlined the added complexity earlier; apologies: I need to aggregate prior to calculating changes. See below for the data and my attempt (dates seem offset and last date's drop doesn't make sense.
[Vega Editor][1]
{
"data": {
"values": [
{"date": "2020-01-01", "country": "CHN", "count": 0},
{"date": "2020-01-02", "country": "CHN", "count": 2},
{"date": "2020-01-03", "country": "CHN", "count": 4},
{"date": "2020-01-01", "country": "GER", "count": 0},
{"date": "2020-01-02", "country": "GER", "count": 2},
{"date": "2020-01-03", "country": "GER", "count": 4},
{"date": "2020-01-04", "country": "GER", "count": 6}
]
},
"transform": [
{
"aggregate": [{"op": "sum", "field":"count", "as":"daily_count"}],
"groupby": ["date"]
},
{
"window": [
{"op": "lead", "field": "daily_count", "as": "daily_count_tomorrow"}
]
},
{"filter": "isValid(datum.daily_count_tomorrow)"},
{"calculate": "datum.daily_count_tomorrow - datum.daily_count", "as": "change"}
],
"mark": "bar",
"encoding": {
"x": {"type": "ordinal", "field": "date", "timeUnit": "yearmonthdate"},
"y": {"type": "quantitative", "field": "change"}
}
}
[1]: https://vega.github.io/editor/#/url/vega-lite/N4KABGBEAmCGAutIC4yghSA3WAbArgKYDOKYA2uBhMDAoWZAEwAMrAtCwIydeQA0UAMYB7fADt4AJwCejAMIAJAHIDhYyWRYBfflWq048BqmZsWvTkzWRRE6XNNLVg2xvhkmu-RkP1GrBzcnADMNnaSsgoq4e5kACzePjR0xgHmltyx9lGmAOIAogBK2ZqoOnrUKUYmUIEWwWylDoyFJa4RHqhelVV+aab1mWEd7rlQbc0J3lVoqbVmQTws8c3jkJOj9mQAbNo+ALpU3pDSsOLEAGYiUgC2ZJQGyVCwAOavUoSv-qjktCIAB0YxHw91clwAloRcNAUG5tq5YKRkHQIbgZAB9TqQbQHXrUSAfMQAgBGjgo80gR2oM18z0gAHcIeJoCIGQ9nilAYxcIRYLDwVCYYw4GjMdjEcioKL0Vj3Bj4CJbjcpGycc9qRhaSlIbhjFJGBDiAA1PAQ6AACiMoIAdDLxfLFcqpKqGQBKHH4uZCPBCfC4H7ShC2+1y+wKpUqtlgdhga23O2wMVhzSSxhCAAW51eDH2EDxICokFusCkAGtGCTSwIi4RxKJoMzXmR0BhIAAPFunGQAhY3RviPA2SHQ2GmGo2eAQ26EACq4ghXSgMj5dxEkgzE+1y678B7CwAjvhzlPEFOsAxBaP01nxDn1RB9togA
Yes, you can do this using the window transform with the lead or lag operation. For example (vega editor):
{
"data": {
"values": [
{"date": "2020-01-01", "b": 29},
{"date": "2020-01-02", "b": 30},
{"date": "2020-01-03", "b": 32},
{"date": "2020-01-04", "b": 31},
{"date": "2020-01-05", "b": 34}
]
},
"transform": [
{"window": [{"op": "lead", "field": "b", "as": "b1"}]},
{"filter": "isValid(datum.b1)"},
{"calculate": "datum.b1 - datum.b", "as": "change"}
],
"mark": "bar",
"encoding": {
"x": {"type": "ordinal", "field": "date", "timeUnit": "yearmonthdate"},
"y": {"type": "quantitative", "field": "change"},
"color": {
"condition": {"test": "datum.change > 0", "value": "green"},
"value": "red"
}
}
}

Vega-lite difference between Firefox and Chrome

I have a vega-lite chart that shows up as expected in Chrome (72.0.3626.96), but not in Firefox (70.0.1). I have checked the spec in the Vega Editor. Does anyone know why this might be?
Here are the rendered charts:
Firefox:
Chrome:
Here is the spec:
Any help you might be able to give would be much appreciated.
Apologies, but I do not know how to collapse this code.
{
"$schema": "https://vega.github.io/schema/vega-lite/v3.2.1.json",
"background": "white",
"config": {"mark": {"tooltip": null}, "view": {"height": 300, "width": 400}},
"datasets": {
"data-511198e25d4dbee99248144390684caa": [
{
"counts": 338,
"filter_method": "greater than",
"grade": "9",
"index": 3,
"perc": 0.2669826224328594,
"school_code": "Board",
"threshold": "8",
"year": 20172018,
"year_lab": "2017/18",
"year_lab_q": "2017"
},
{
"counts": 414,
"filter_method": "greater than",
"grade": "9",
"index": 4,
"perc": 0.30689399555226093,
"school_code": "Board",
"threshold": "8",
"year": 20182019,
"year_lab": "2018/19",
"year_lab_q": "2018"
}
],
"data-72a083843a98847e44077116c495e448": [
{
"counts": 49,
"filter_method": "greater than",
"grade": "9",
"index": 0,
"perc": 0.3356164383561644,
"school_code": "KING",
"threshold": "8",
"year": 20142015,
"year_lab": "2014/15",
"year_lab_q": "2014"
},
{
"counts": 62,
"filter_method": "greater than",
"grade": "9",
"index": 5,
"perc": 0.3668639053254438,
"school_code": "MLTS",
"threshold": "8",
"year": 20162017,
"year_lab": "2016/17",
"year_lab_q": "2016"
},
{
"counts": 53,
"filter_method": "greater than",
"grade": "9",
"index": 6,
"perc": 0.29608938547486036,
"school_code": "KING",
"threshold": "8",
"year": 20172018,
"year_lab": "2017/18",
"year_lab_q": "2017"
},
{
"counts": 44,
"filter_method": "greater than",
"grade": "9",
"index": 7,
"perc": 0.25882352941176473,
"school_code": "MLTS",
"threshold": "8",
"year": 20172018,
"year_lab": "2017/18",
"year_lab_q": "2017"
},
{
"counts": 53,
"filter_method": "greater than",
"grade": "9",
"index": 8,
"perc": 0.3212121212121212,
"school_code": "KING",
"threshold": "8",
"year": 20182019,
"year_lab": "2018/19",
"year_lab_q": "2018"
},
{
"counts": 61,
"filter_method": "greater than",
"grade": "9",
"index": 9,
"perc": 0.25206611570247933,
"school_code": "MLTS",
"threshold": "8",
"year": 20182019,
"year_lab": "2018/19",
"year_lab_q": "2018"
}
]
},
"height": 400,
"layer": [
{
"data": {"name": "data-72a083843a98847e44077116c495e448"},
"encoding": {
"color": {
"field": "school_code",
"legend": {"labelFontSize": 15, "titleFontSize": 20},
"title": null,
"type": "nominal"
},
"tooltip": [
{
"field": "perc",
"format": ".2%",
"title": "percentage",
"type": "quantitative"
},
{
"field": "counts",
"title": "number",
"type": "quantitative"
},
{"field": "year_lab", "title": "school year", "type": "nominal"},
{"field": "school_code", "title": "level", "type": "nominal"},
{"field": "grade", "type": "nominal"},
{"field": "filter_method", "type": "nominal"},
{"field": "threshold", "type": "nominal"}
],
"x": {
"axis": {"format": "%Y", "tickCount": 5},
"field": "year_lab_q",
"scale": {"domain": ["2013.9", "2018.5"]},
"title": "School Year (beginning)",
"type": "temporal"
},
"y": {
"axis": {"format": ".0%"},
"field": "perc",
"title": "Percentage",
"type": "quantitative"
}
},
"mark": {"point": true, "type": "line"},
"selection": {
"selector001": {
"bind": "scales",
"encodings": ["x", "y"],
"type": "interval"
}
}
},
{
"data": {"name": "data-511198e25d4dbee99248144390684caa"},
"encoding": {
"color": {
"field": "school_code",
"legend": {"labelFontSize": 15, "titleFontSize": 20},
"scale": {"domain": ["Board"], "range": ["black"]},
"title": null,
"type": "nominal"
},
"tooltip": [
{
"field": "perc",
"format": ".2%",
"title": "percentage",
"type": "quantitative"
},
{
"field": "counts",
"title": "number",
"type": "quantitative"
},
{"field": "year_lab", "title": "school year", "type": "nominal"},
{"field": "school_code", "title": "level", "type": "nominal"},
{"field": "grade", "type": "nominal"},
{"field": "filter_method", "type": "nominal"},
{"field": "threshold", "type": "nominal"}
],
"x": {"field": "year_lab_q", "type": "temporal"},
"y": {"field": "perc", "type": "quantitative"}
},
"mark": {"point": true, "type": "line"}
}
],
"resolve": {"scale": {"color": "independent"}},
"title": "A title!",
"width": 700
}
It appears that your temporal values are not being parsed correctly in firefox (details of javascript date parsing behavior is often browser-dependent). You could try forcing the correct parsing by changing your data specification (in both places) to:
"data": {
"name": "data-72a083843a98847e44077116c495e448",
"format": {"parse": {"year_lab_q": "date:%Y"}}
}
This should ensure that the year string is parsed as a year, rather than e.g. a unix timestamp.
The other place date parsing is happening is in your domain specification. You might try changing those to a more standard time format, e.g.
"domain": ["2013-11-01", "2018-06-01"]