Skip to content

Instantly share code, notes, and snippets.

@declann
Created October 22, 2023 11:08
Show Gist options
  • Save declann/243beeaf04ac83c4b7073b4fa95f893a to your computer and use it in GitHub Desktop.
Save declann/243beeaf04ac83c4b7073b4fa95f893a to your computer and use it in GitHub Desktop.
Vega spec from Sun Oct 22 2023
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"width": 700,
"height": 400,
"padding": 5,
"data": [
{
"name": "table",
"values": [
{"category": 1960, "amount": 4},
{"category": 1990, "amount": 8},
{"category": 2020, "amount": 28},
{"category": 2025, "amount": 29},
{"category": 2030, "amount": 30},
{"category": 2035, "amount": 32},
{"category": 2040, "amount": 33},
{"category": 2045, "amount": 34},
{"category": 2050, "amount": 38},
{"category": 2100, "amount": 90},
{"category": 2150, "amount": 5}
]
},
{
"name": "seq",
"transform": [
{"type": "sequence", "start": 1960, "stop": 2200, "step": 5},
{"type": "filter", "expr": "datum.data >= bau.category"}
]
},
{
"name": "seq2",
"transform": [
{"type": "sequence", "start": 1960, "stop": 2200, "step": 5},
{
"type": "lookup",
"from": "table",
"key": "category",
"fields": ["data"],
"as": ["table"]
},
{"type": "filter", "expr": "datum.table != null"},
{"type": "window", "ops": ["lag"], "fields": ["table"]},
{"type": "filter", "expr": "datum.lag_table != null"},
{
"type": "formula",
"expr": "datum.lag_table.amount+(datum.table.amount-datum.lag_table.amount)*(datum.table.category-datum.lag_table.category)",
"as": "interpolated"
}
]
},
{
"name": "interpolated",
"transform": [
{"type": "sequence", "start": 1960, "stop": 2200, "step": 1},
{
"type": "lookup",
"from": "table",
"key": "category",
"fields": ["data"],
"values": ["category"],
"as": ["group"]
},
{"type": "window", "ops": ["next_value"], "fields": ["group"]},
{
"type": "lookup",
"from": "seq2",
"key": "data",
"fields": ["next_value_group"],
"as": ["group"]
},
{"type": "filter", "expr": "datum.group != null"},
{
"type": "formula",
"expr": "max(0,datum.data < bau.category ? datum.group.lag_table.amount+(datum.group.table.amount-datum.group.lag_table.amount)*(datum.data-datum.group.lag_table.category)/(datum.group.table.category-datum.group.lag_table.category) : bau.amount+(0-bau.amount)*(datum.data-bau.category)/(zero_category-bau.category))",
"as": "interpolated"
}
]
},
{
"name": "interpolated_baseline",
"transform": [
{"type": "sequence", "start": 1960, "stop": 2200, "step": 1},
{
"type": "lookup",
"from": "table",
"key": "category",
"fields": ["data"],
"values": ["category"],
"as": ["group"]
},
{"type": "window", "ops": ["next_value"], "fields": ["group"]},
{
"type": "lookup",
"from": "seq2",
"key": "data",
"fields": ["next_value_group"],
"as": ["group"]
},
{"type": "filter", "expr": "datum.group != null"},
{
"type": "formula",
"expr": "datum.group.lag_table.amount+(datum.group.table.amount-datum.group.lag_table.amount)*(datum.data-datum.group.lag_table.category)/(datum.group.table.category-datum.group.lag_table.category)",
"as": "interpolated"
}
]
},
{
"name": "seq3",
"transform": [
{"type": "sequence", "start": 1960, "stop": 2200, "step": 5},
{
"type": "lookup",
"from": "seq2",
"key": "data",
"fields": ["data"],
"as": ["table"]
},
{
"type": "window",
"ops": ["first_value"],
"sort": {"field": "table"},
"fields": ["table"]
},
{
"type": "formula",
"as": "aaa",
"expr": "isValid(datum.table) ? 0 : datum.lag_table"
}
]
},
{
"name": "table-first",
"source": "table",
"transform": [{"type": "filter", "expr": "datum.category == 1960"}]
},
{
"name": "table-baus",
"source": "table",
"transform": [
{"type": "filter", "expr": "datum.category <= bau.category"}
]
}
],
"signals": [
{
"name": "bau",
"value": {"category": 2020, "amount": 28},
"on": [{"events": "@baus:mouseover", "update": "datum"}]
},
{
"name": "zero_category",
"update": "max(zero_category,bau.category)",
"value": 2050,
"on": [
{"events": "@zeros:mouseover", "update": "max(datum.data,bau.category)"}
]
}
],
"scales": [
{
"name": "xscale",
"type": "linear",
"zero": false,
"domain": {"data": "table", "field": "category"},
"range": "width",
"padding": 0.05,
"round": true
},
{
"name": "yscale",
"domain": {"data": "table", "field": "amount"},
"nice": true,
"range": "height"
}
],
"axes": [
{
"orient": "bottom",
"scale": "xscale",
"format": ".0f",
"labelFontSize": 20,
"tickCount": 6
},
{"orient": "left", "scale": "yscale"}
],
"marks": [
{
"type": "rect",
"from": {"data": "interpolated_baseline"},
"encode": {
"enter": {"fill": {"value": "pink"}, "opacity": {"value": 0.1}},
"update": {
"x": {"scale": "xscale", "field": "data"},
"width": {"value": 10},
"y": {"scale": "yscale", "field": "interpolated"},
"y2": {"scale": "yscale", "value": 0}
}
}
},
{
"type": "rect",
"from": {"data": "interpolated"},
"encode": {
"enter": {"fill": {"value": "steelblue"}, "opacity": {"value": 0.5}},
"update": {
"x": {"scale": "xscale", "field": "data"},
"width": {"value": 9},
"y": {"scale": "yscale", "field": "interpolated"},
"y2": {"scale": "yscale", "value": 0}
}
}
},
{
"type": "rect",
"from": {"data": "table"},
"encode": {
"enter": {
"x": {"scale": "xscale", "field": "category"},
"width": {"scale": "xscale", "band": 1},
"y": {"scale": "yscale", "field": "amount"},
"y2": {"scale": "yscale", "value": 0},
"opacity": {"value": 0.1}
},
"update": {"fill": {"value": "steelblue"}}
}
},
{
"type": "line",
"from": {"data": "table-baus"},
"encode": {
"enter": {
"strokeWidth": {"value": 10},
"stroke": {"value": "black"},
"interpolate": {"value": "linear"},
"strokeCap": {"value": "round"}
},
"update": {
"x": {"scale": "xscale", "field": "category", "band": 1},
"y": {"scale": "yscale", "field": "amount"}
}
}
},
{
"type": "rule",
"encode": {
"enter": {
"strokeWidth": {"value": 10},
"strokeCap": {"value": "round"}
},
"update": {
"x": {"scale": "xscale", "signal": "bau.category", "band": 1},
"y": {"scale": "yscale", "signal": "bau.amount", "offset": 0},
"x2": {"scale": "xscale", "signal": "zero_category", "band": 1},
"y2": {"scale": "yscale", "value": 0, "offset": 0}
}
}
},
{
"type": "rule",
"encode": {
"enter": {
"strokeWidth": {"value": 10},
"strokeCap": {"value": "round"}
},
"update": {
"x2": {"scale": "xscale", "value": 2200, "band": 1},
"x": {"scale": "xscale", "signal": "zero_category", "band": 1},
"y": {"scale": "yscale", "value": 0, "offset": 0}
}
}
},
{
"type": "rule",
"from": {"data": "table-first"},
"encode": {
"enter": {
"strokeWidth": {"value": 10},
"strokeCap": {"value": "round"}
},
"update": {
"x2": {"scale": "xscale", "field": "category", "band": 1},
"x": {"scale": "xscale", "field": "category", "band": 0},
"y": {"scale": "yscale", "field": "amount", "offset": 0}
}
}
},
{
"type": "symbol",
"name": "zeros",
"from": {"data": "seq"},
"encode": {
"enter": {
"size": {"value": 500},
"fill": {"value": "lightblue"},
"stroke": {"value": "black"},
"shape": {"value": "triangle"},
"opacity": {"value": 0.8}
},
"update": {
"x": {"scale": "xscale", "field": "data", "band": 1},
"y": {"scale": "yscale", "value": "0", "offset": 0}
}
}
},
{
"type": "symbol",
"name": "baus",
"from": {"data": "table"},
"encode": {
"enter": {
"size": {"value": 500},
"fill": {"value": "pink"},
"stroke": {"value": "black"},
"shape": {"value": "square"},
"opacity": {"value": 0.8}
},
"update": {
"x": {"scale": "xscale", "field": "category", "band": 1},
"y": {"scale": "yscale", "field": "amount", "offset": 0}
}
}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment