Skip to content

Wind Map

vector marks on a grid show both direction and intensity—here, the speed of winds. Expressions for rotate, length, and stroke values are evaluated in the database. Both the legend and map support interactive selections to highlight values.

Loading Example...

Credit: Adapted from an Observable Plot example.

Specification

js
import * as vg from "@uwdata/vgplot";

await vg.coordinator().exec([
  vg.loadParquet("wind", "data/wind.parquet", {select: ["*", "row_number() over () as id"]})
]);

const $selected = vg.Selection.union();
const $length = vg.Param.value(2);

export default vg.vconcat(
  vg.colorLegend({for: "wind-map", label: "Speed (m/s)", as: $selected}),
  vg.plot(
    vg.vector(
      vg.from("wind"),
      {
        x: "longitude",
        y: "latitude",
        rotate: vg.sql`degrees(atan2(u, v))`,
        length: vg.sql`${$length} * sqrt(u * u + v * v)`,
        stroke: vg.sql`sqrt(u * u + v * v)`,
        channels: {id: "id"}
      }
    ),
    vg.region({as: $selected, channels: ["id"]}),
    vg.highlight({by: $selected}),
    vg.name("wind-map"),
    vg.lengthScale("identity"),
    vg.colorZero(true),
    vg.inset(10),
    vg.aspectRatio(1),
    vg.width(680)
  ),
  vg.slider({min: 1, max: 7, step: 0.1, as: $length, label: "Vector Length"})
);
yaml
meta:
  title: Wind Map
  description: >
    `vector` marks on a grid show both direction and intensity—here, the speed of winds.
    Expressions for `rotate`, `length`, and `stroke` values are evaluated in the database.
    Both the legend and map support interactive selections to highlight values.
  credit: Adapted from an [Observable Plot example](https://observablehq.com/@observablehq/plot-wind-map).
data:
  wind:
    file: data/wind.parquet
    select: ['*', 'row_number() over () as id']
params:
  selected: { select: union }
  length: 2
vconcat:
- legend: color
  for: wind-map
  label: Speed (m/s)
  as: $selected
- name: wind-map
  plot:
  - mark: vector
    data: { from: wind }
    x: longitude
    y: latitude
    rotate: { sql: "degrees(atan2(u, v))" }
    length: { sql: $length * sqrt(u * u + v * v) }
    stroke: { sql: sqrt(u * u + v * v) }
    channels: { id: id }
  - select: region
    as: $selected
    channels: ['id']
  - select: highlight
    by: $selected
  lengthScale: identity
  colorZero: true
  inset: 10
  aspectRatio: 1
  width: 680
- input: slider
  min: 1
  max: 7
  step: 0.1
  as: $length
  label: Vector Length
json
{
  "meta": {
    "title": "Wind Map",
    "description": "`vector` marks on a grid show both direction and intensity—here, the speed of winds. Expressions for `rotate`, `length`, and `stroke` values are evaluated in the database. Both the legend and map support interactive selections to highlight values.\n",
    "credit": "Adapted from an [Observable Plot example](https://observablehq.com/@observablehq/plot-wind-map)."
  },
  "data": {
    "wind": {
      "file": "data/wind.parquet",
      "select": [
        "*",
        "row_number() over () as id"
      ]
    }
  },
  "params": {
    "selected": {
      "select": "union"
    },
    "length": 2
  },
  "vconcat": [
    {
      "legend": "color",
      "for": "wind-map",
      "label": "Speed (m/s)",
      "as": "$selected"
    },
    {
      "name": "wind-map",
      "plot": [
        {
          "mark": "vector",
          "data": {
            "from": "wind"
          },
          "x": "longitude",
          "y": "latitude",
          "rotate": {
            "sql": "degrees(atan2(u, v))"
          },
          "length": {
            "sql": "$length * sqrt(u * u + v * v)"
          },
          "stroke": {
            "sql": "sqrt(u * u + v * v)"
          },
          "channels": {
            "id": "id"
          }
        },
        {
          "select": "region",
          "as": "$selected",
          "channels": [
            "id"
          ]
        },
        {
          "select": "highlight",
          "by": "$selected"
        }
      ],
      "lengthScale": "identity",
      "colorZero": true,
      "inset": 10,
      "aspectRatio": 1,
      "width": 680
    },
    {
      "input": "slider",
      "min": 1,
      "max": 7,
      "step": 0.1,
      "as": "$length",
      "label": "Vector Length"
    }
  ]
}