{
"$schema": "https://vega.github.io/schema/vega/v3.0.json",
"width": 900,
"height": 520,
"autosize": "none",
"config": {
"legend": {
"gradientWidth": 120,
"gradientHeight": 10
}
},
"signals": [
{ "name": "tx", "update": "width / 2" },
{ "name": "ty", "update": "height / 2" },
{
"name": "scale",
"value": 700,
"on": [{
"events": {"type": "wheel", "consume": true},
"update": "clamp(scale * pow(1.0005, -event.deltaY * pow(16, event.deltaMode)), 150, 3000)"
}]
},
{
"name": "angles",
"value": [0, 0],
"on": [{
"events": "mousedown",
"update": "[rotateX, centerY]"
}]
},
{
"name": "cloned",
"value": null,
"on": [{
"events": "mousedown",
"update": "copy('projection')"
}]
},
{
"name": "start",
"value": null,
"on": [{
"events": "mousedown",
"update": "invert(cloned, xy())"
}]
},
{
"name": "drag", "value": null,
"on": [{
"events": "[mousedown, window:mouseup] > window:mousemove",
"update": "invert(cloned, xy())"
}]
},
{
"name": "delta", "value": null,
"on": [{
"events": {"signal": "drag"},
"update": "[drag[0] - start[0], start[1] - drag[1]]"
}]
},
{
"name": "rotateX", "value": 0,
"on": [{
"events": {"signal": "delta"},
"update": "angles[0] + delta[0]"
}]
},
{
"name": "centerY", "value": 39.262570,
"on": [{
"events": {"signal": "delta"},
"update": "clamp(angles[1] + delta[1], -60, 60)"
}]
}
],
"data": [
{
"name": "states",
"url": "data/us-10m.json",
"format": {"type": "topojson", "feature": "states"}
},
{
"name": "obesity",
"url": "data/obesity.json",
"transform": [
{
"type": "lookup",
"from": "states", "key": "id",
"fields": ["id"], "as": ["geo"]
},
{
"type": "filter",
"expr": "datum.geo"
},
{
"type": "formula", "as": "centroid",
"expr": "geoCentroid('projection', datum.geo)"
},
{
"type": "force",
"static": true,
"forces": [
{"force": "collide", "radius": {"expr": "1 + sqrt(datum.rate) / 0.013"}},
{"force": "x", "x": "centroid[0]"},
{"force": "y", "y": "centroid[1]"}
]
}
]
}
],
"projections": [
{
"name": "projection",
"type": "mercator",
"scale": {
"signal": "scale"
},
"rotate": [
{
"signal": "rotateX"
},
0,
0
],
"center": [
-101.08,
{
"signal": "centerY"
}
],
"translate": [
{
"signal": "width / 2"
},
{
"signal": "height / 2"
}
]
}
],
"scales": [
{
"name": "size",
"domain": {"data": "obesity", "field": "rate"},
"range": [0, 5000]
},
{
"name": "color",
"type": "sequential",
"nice": true,
"domain": {"data": "obesity", "field": "rate"},
"range": "ramp"
}
],
"legends": [
{
"title": "% of Obese Adults",
"orient": "bottom-right",
"type": "gradient",
"fill": "color",
"format": ".1%"
}
],
"marks": [
{
"type": "shape",
"from": {
"data": "states"
},
"encode": {
"enter": {
"strokeWidth": {
"value": 2
},
"stroke": {
"value": "gray"
},
"fill": {
"value": "transparent"
}
}
},
"transform": [
{
"type": "geoshape",
"projection": "projection"
}
]
},
{
"name": "circles",
"type": "symbol",
"from": {"data": "obesity"},
"encode": {
"update": {
"size": {"scale": "size", "field": "rate"},
"fill": {"scale": "color", "field": "rate"},
"stroke": {"value": "white"},
"strokeWidth": {"value": 1.5},
"x": {"field": "x"},
"y": {"field": "y"},
"tooltip": {"signal": "'Obesity Rate: ' + format(datum.rate, '.1%')"}
},
"hover":{
"strokeWidth": {
"value": 1.5
},
"stroke": {
"value": "black"
}
}
}
},
{
"type": "text",
"interactive": false,
"from": {"data": "circles"},
"encode": {
"enter": {
"align": {"value": "center"},
"baseline": {"value": "middle"},
"fontSize": {"value": 13},
"fontWeight": {"value": "bold"},
"text": {"field": "datum.state"}
},
"update": {
"x": {"field": "x"},
"y": {"field": "y"}
}
}
}
]
}