Blog

懒癌晚期


Project maintained by VirusPC Hosted on GitHub Pages — Theme by mattgraham

Back Home

Vega: Specification

一个 Vega specification 是一个 JSON 对象,它描述了一个交互式可视化设计。在定义好 specification 后,我们就可以通过调用 Vega 提供的 API 来解析 specification,从而产生交互式可视化视图。

Vega specification 整体结构如下

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "title": "title",
  "description": "A specification outline example.",
  "width": 500,
  "height": 200,
  "padding": 5,
  "autosize": "pad",

  "signals": [],
  "data": [],
  "scales": [],
  "projections": [],
  "axes": [],
  "legends": [],
  "marks": []
}

width, height

数字值。决定绘制数据的视图范围(data rectangle 组件)。额外的组件(axes, legends)一般会占用额外的空间(将它们放置在视图外面的padding所决定的区域中)。

padding

数字值。定义 data rectangle 之外的padding。它所定义的范围用于放置额外的组件。padding 在 autosize 完成之后进行。

autosize

字符串值。自动调整画布的 content 和 padding 或者组件大小。其属性值有以下几种选项:

signals

signals 的属性值是 signal 数组。signal 是动态变量(与静态常量相对应),是可视化的参数,可以驱动交互行为。它的值是 reactive 的,可以对输入事件流、外部 API 调用或是上流signal(数据流中位于本 signal 之前的 signal)做出反应,使得值发生变化。其值的变化会传播到其他用到该 signal 的地方,可视化会自动重新渲染。

signal 在定义后可以在 specification 的其他部分被使用:假设有一个signal 的 name 是 indexDate,则其他属性的属性值(包括表达式)中可直接引用它的名称 "expr": month(indexDate)

"signals": [
  {
    "name": "indexDate",
    "description": "A date value that updates in response to mousemove.",
    "update": "datetime(2005, 0, 1)",
    "on": [{"events": "mousemove", "update": "invert('xscale', x())"}]
  }
]

以下是 signal 的一些属性:

data

数据集的定义和转换(transform)。在这里定义要加载的数据集以及如何对其进行处理。

"data": [
  {
    "name": "stats",
    "format": {"type": "csv", "parse": "auto"},
    "source": "table.csv",
    "transform": [
      {
        "type": "aggregate",
        "groupby": ["x"],
        "ops": ["average", "sum", "min", "max"],
        "fields": ["y", "y", "y", "y"]
      }
    ]
  }
]

以下是 data 的一些属性

scales

Scales 将数据值(numbers,dates,categories,etc)映射为视觉值(pixels,colors,sizes)。Vega 使用 d3-scale 库所提供的 scales。

"scales": [
  {
    "name": "xscale",
    "type": "band",
    "domain": {"data": "table", "field": "category"},
    "range": "width",
    "padding": 0.05,
    "round": true
  },
  {
    "name": "yscale",
    "domain": {"data": "table", "field": "amount"},
    "nice": true,
    "range": "height"
  }
]

以下是 scale 的一些公共属性,不同类型的 scale 还有各自独特的属性

axes

使用刻度线、网格线和标签来将 scale 可视化。Vega 目前支持笛卡尔坐标系下的坐标轴。axes 可以在规范的顶层定义,也可以作为组标记的一部分。

"axes": [
  {
    "orient": "bottom",
    "scale": "x",
    "title": "X-Axis",
    "encode": {
      "ticks": {
        "update": {
          "stroke": {"value": "steelblue"}
        }
      },
      "labels": {
        "interactive": true,
        "update": {
          "text": {"signal": "format(datum.value, '+,')"},
          "fill": {"value": "steelblue"},
          "angle": {"value": 50},
          "fontSize": {"value": 14},
          "align": {"value": "left"},
          "baseline": {"value": "middle"},
          "dx": {"value": 3}
        },
        "hover": {
          "fill": {"value": "firebrick"}
        }
      },
      "title": {
        "update": {
          "fontSize": {"value": 16}
        }
      },
      "domain": {
        "update": {
          "stroke": {"value": "#333"},
          "strokeWidth": {"value": 1.5}
        }
      }
    }
  }
]

axe 有以下一些属性:

marks

将数据编码为图形标记,比如条形图中的矩形、折线图中的线和其它符号等。mark 的属性可以是简单的常量或数据字段,也可以使用比例尺将数据值映射到视觉值。

vega 支持的 mark 类型有 arc, area, image, group(其它mark的容器,即 svg 中的 g 标签), line(描线,通常用于显示随着时间推移而发生的变化), path, rect, rule, shape, symbol, text 以及 trail(可以基于下层的数据来改变尺寸的线条)。

"marks": [{
  "type": "rect",
  "from": {"data": "table"},
  "encode": {
    "enter": {
      "y": {"scale": "yscale", "field": "value"},
      "y2": {"scale": "yscale", "value": 0},
      "fill": {"value": "steelblue"}
    },
    "update": {...},
    "exit": {...},
    "hover": {...}
  }
}]

以下是 mark 的一些属性

将 scale 可视化为颜色、形状或是尺寸视觉编码。

projections

对地图(经度、纬度)数据进行制图投影。

title

设置整个 chart 的标题。

以下是 title 的一些属性:

description

整个可视化的描述。不显示出来,可被读屏软件读出。

background

设置整个视图的背景颜色(默认为透明)。

encode

编码指令,用于表示图表数据矩形的顶层组标记的视觉属性。例如,这可以用来设置绘图区域的背景填充颜色,而不是整个视图。

usermeta

可选元数据。将会被 Vega parser 忽略。


相关资料:
参数类型
Specification 属性