Vega-Lite

A Grammar of Interactive Graphics

Crash Course!

What

Background

"Vega-lite is a high-level grammar of interactive graphics. It provides a concise, declarative JSON syntax for rapidly generating visualizations to support analysis."

 

D3 -> Vega -> Vega-Lite

Stats

No Item Description
1. Total Commits 9,105
2. Last Commit 4 days ago
3. Opened Issues 475 out of 2,645
4. Opened Pull Requests 24 out of 4,393 closed
5. Total Stars 3.4k
6. Total Fork 432
7. First Public Release 9th May 2015 (v.0.6.4)
8. Latest version v5.1.0

Contributers

From the University of Washington Interactive Data Lab:

Why

Existing Tools

Facilitate rapid exploration with concise specifications by omitting low-level details.

 

Infer sensible defaults and allow customization by overriding defaults.

 

But limited support for interactions.

 

Closed source & proprietary software

Existing Tools

Offer fine-grained control for composing visualizations.

 

But requires technical expertise and verbose specifications (e.g. 100 LOCs for a bar chart)

How

Specifications

Item Description
Data Input data source to visualize
Transform Filter, aggregations, binning, etc
Mark Type of visualization
Encoding Mapping data to mark properties
Scale Mapping data values to visual values
Guides Axes & Legends that visualize scales

Measurement

No Type Description
1 Quantitative Numerical values 
2 Temporal Datetime values
3 Ordinal Categorical values that have natural orders or ranking (e.g. size, priority, severity)
4 Nominal Categorical values without specific orders (e.g. colors, genders, country)

Transformations

No Transforms Description
1 Aggregate Perform aggregations 
2 Bin Discretizes numeric values into a sets of bins (for Histogram)
3 Filter Filter certain conditions
4 Time unit  Convert datetime into ordinal
5 Calculate Derive new categorical values based on a formula
6 Impute Impute missing data
7 Lookup Perform join with lookup table

Aggregations

No Function Description
1 Mean Average of values
2 Sum Addition of all values 
3 Median Middle value 
4 Min  Smallest value
5 Max Largest value
6 Count No of records

Composition

No Function Description
1 Facet Partition data to create view for each subset (col / row)
2 Layer Place views on top of each other
3 Concat Place views side-by-side (hconcat / vconcat)
4 Repeat Concat similar views with difference field

Learn by Examples

  • Single View Specification
  • Layered & Multi-View Composition
  • Interactions with Selection

Single View

{
  "data": { "url": "data/seattle-weather.csv"},
  "mark": "tick",
  "encoding": {
    "x": {
      "field": "temp_max", 
      "type": "quantitative"
    }
  }
}

Strip Plot

{
  "data": { "url": "data/seattle-weather.csv"},
  "mark": "bar",
  "encoding": {
    "x": {
      "bin": true,
      "field": "temp_max", 
      "type": "quantitative"
    },
    "y": {
      "aggregate": "count",
      "type": "quantitative"
    }
  }
}

Histogram

{
  "data": { "url": "data/seattle-weather.csv"},
  "mark": "bar",
  "encoding": {
    "x": { 
      "timeUnit": "month",  
      "field": "date", 
      "title": "Month"
    },
    "y": {
      "aggregate": "mean",
      "field": "temp_max",
      "type": "quantitative",
      "title": "Max Temp"
    },
    "color": {
      "field": "weather",
       "type": "nominal",
      "scale": {
        "domain": ["sun", "fog", "drizzle", "rain", "snow"],
        "range": ["#e7ba52", "#c7c7c7", "#aec7e8", "#1f77b4", "#9467bd"]
      },
      "title": "Weather type"
    }
  }
}

Color & Scale

Multi Views

{
  "data": { "url": "data/seattle-weather.csv"},
  "mark": "bar",
  "encoding": {
    ...
    "column": {
      "field": "weather",
       "type": "nominal",
      "title": "Weather type"
    }
  }
}

Facet

{
  "data": {"url": "data/seattle-weather.csv"},
  "layer": [
    {
      "mark": "bar",
      "encoding": {
        "x": {"timeUnit": "month", "field": "date", "title": "Month"},
        "y": {
          "aggregate": "mean",
          "field": "temp_max",
          "type": "quantitative",
          "title": "Max Temp"
        }
      }
    },
    {
      "mark": "rule",
      "encoding": {
        "y": {"aggregate": "mean", "field": "temp_max", "type": "quantitative"},
        "color": {"value": "red"},
        "size": {"value": 3}
      }
    }
  ]
}

Layering

{
  "data": {"url": "data/seattle-weather.csv"},
  "vconcat": [
    {
      "mark": "bar",
      "encoding": {
        "x": {"timeUnit": "month", "field": "date", "title": "Month"},
        "y": {
          "aggregate": "mean",
          "field": "temp_max",
          "type": "quantitative",
          "title": "Max Temp"
        }
      }
    },
    {
      "mark": "bar",
      "encoding": {
        "x": {"timeUnit": "month", "field": "date", "title": "Month"},
        "y": {
          "aggregate": "mean",
          "field": "precipitation",
          "type": "quantitative",
          "title": "Precipitation"
        }
      }
    }
  ]
}

Concat

{
  "repeat": {"column": ["precipitation", "temp_max", "wind"]},
  "spec": {
    "data": {"url": "data/seattle-weather.csv"},
    "mark": "bar",
    "encoding": {
      "x": {"timeUnit": "month", "field": "date", "type": "ordinal"},
      "y": {
        "aggregate": "mean",
        "field": {"repeat": "column"},
        "type": "quantitative"
      }
    }
  }
}

Repeat

{
  "repeat": {
    "column": ["precipitation", "temp_max", "wind"],
    "row": ["wind", "temp_max", "precipitation"]
    
  },
  "spec": {
    "data": {"url": "data/seattle-weather.csv"},
    "mark": "point",
    "encoding": {
      "x": {
        "field": {"repeat": "row"},
        "type": "quantitative"
      },
      "y": {
        "field": {"repeat": "column"},
        "type": "quantitative"
      }
    }
  }
}

Repeat Both Axes

All Together

Interactions

{
  "data": {"url": "data/cars.json"},
  "mark": "point",
  "transform": [{
    "calculate": "'https://www.google.com/search?q=' + datum.Name", "as": "url"
  }],
  "encoding": {
    "x": {"field": "Horsepower", "type": "quantitative"},
    "y": {"field": "Miles_per_Gallon", "type": "quantitative"},
    "color": {"field": "Origin", "type": "nominal"},
    "tooltip": {"field": "Name", "type": "nominal"},
    "href": {"field": "url", "type": "nominal"}
  }
}

Tooltip & Link

{
  "data": { "url": "data/cars.json"},
  "mark": "circle",
  "params": [{
    "name": "brush",
    "select": "interval"
  }],
  "encoding": {
    "x": {  
      "field": "Horsepower",
      "type": "quantitative"
    },
    "y": {
      "field": "Miles_per_Gallon",
      "type": "quantitative"
    },
    "color": {
      "condition": {"param": "brush", "field": "Origin", "type": "nominal"},
      "value": "grey"
    }
  }
}

Selection

{
  "data": {"url": "data/cars.json"},
  "transform": [{"calculate": "year(datum.Year)", "as": "Year"}],
  "layer": [{
    "params": [{
      "name": "CylYr",
      "value": [{"Cylinders": 4, "Year": 1977}],
      "select": {"type": "point", "fields": ["Cylinders", "Year"]},
      "bind": {
        "Cylinders": {"input": "range", "min": 3, "max": 8, "step": 1},
        "Year": {"input": "range", "min": 1969, "max": 1981, "step": 1}
      }
    }],
    "mark": "circle",
    "encoding": {
      "x": {"field": "Horsepower", "type": "quantitative"},
      "y": {"field": "Miles_per_Gallon", "type": "quantitative"},
      "color": {
        "condition": {"param": "CylYr", "field": "Origin", "type": "nominal"},
        "value": "grey"
      }
    }
  }, {
    "transform": [{"filter": {"param": "CylYr"}}],
    "mark": "circle",
    "encoding": {
      "x": {"field": "Horsepower", "type": "quantitative"},
      "y": {"field": "Miles_per_Gallon", "type": "quantitative"},
      "color": {"field": "Origin", "type": "nominal"},
      "size": {"value": 100}
    }
  }]
}

Input Selection

{
  "data": {"url": "data/cars.json"},
  "params": [
    {"name": "grid", "select": "interval", "bind": "scales"}
  ],
  "mark": "circle",
  "encoding": {
    "x": {
      "field": "Horsepower",
      "type": "quantitative",
      "scale": {"domain": {"param": "grid"}}
    },
    "y": {
      "field": "Miles_per_Gallon",
      "type": "quantitative",
      "scale": {"domain": {"param": "grid"}}
    },
    "size": {"field": "Cylinders", "type": "quantitative"},
    "color": {"field": "Origin", "type": "nominal"}
  }
}

Zoom

{
  "data": {"url": "data/sp500.csv"},
  "vconcat": [
    {
      "width": 480,
      "mark": "area",
      "encoding": {
        "x": {
          "field": "date",
          "type": "temporal",
          "scale": {"domain": {"param": "brush"}},
          "axis": {"title": ""}
        },
        "y": {"field": "price", "type": "quantitative"}
      }
    },
    {
      "width": 480,
      "height": 60,
      "mark": "area",
      "params": [
        {"name": "brush", "select": {"type": "interval", "encodings": ["x"]}}
      ],
      "encoding": {
        "x": {"field": "date", "type": "temporal"},
        "y": {
          "field": "price",
          "type": "quantitative",
          "axis": {"tickCount": 3, "grid": false}
        }
      }
    }
  ]
}

Overview & Detail

Resources

Vega-lite: A Visualization Grammar

By Wan Mohd Hafiz

Vega-lite: A Visualization Grammar

  • 266