首页
/ Vega-Lite 数据分面可视化完全指南

Vega-Lite 数据分面可视化完全指南

2025-07-08 04:40:48作者:舒璇辛Bertina

什么是分面可视化

分面可视化(Faceted Visualization),也称为Trellis Plot或Small Multiples,是一种将数据按照某个维度分割成多个子集,并在多个相似的子图中分别展示这些子集数据的可视化技术。这种技术特别适合用于比较不同数据子集之间的模式和差异。

Vega-Lite中的两种分面方式

Vega-Lite提供了两种创建分面视图的方法:

1. 分面操作符(Facet Operator)

这是最灵活的分面方式,允许与其他视图组合操作符一起使用。基本语法结构如下:

{
  "facet": {
    // 分面定义
  },
  "spec": // 子图规格
}

分面规格包含以下关键属性:

  • facet: 定义如何分面数据
  • spec: 定义每个分面子图的展示方式
  • columns: 控制分面网格的列数

分面字段定义

分面字段定义包含:

  • bin: 是否对连续字段进行分箱
  • field: 数据字段名
  • timeUnit: 时间单位转换
  • type: 数据类型
  • header: 分面标题配置

行/列分面映射

通过facet属性可以定义行和列的映射关系:

  • column: 列分面定义
  • row: 行分面定义

2. 分面编码通道(Facet Encoding Channels)

这是一种快捷方式,Vega-Lite会自动将其转换为使用分面操作符的规格。包括:

  • facet通道
  • row通道
  • column通道

这些通道除了支持基本字段定义外,还可以包含:

  • align: 子图对齐方式
  • center: 是否居中
  • spacing: 子图间距
  • columns: 仅facet通道支持,控制分面网格列数

分面标题(Headers)

类似于位置通道的坐标轴,分面通道的标题(header)提供了每个行和列所代表数据值的引导。可以通过header配置自定义标题的显示方式。

实际应用示例

行分面直方图

创建一个按"origin"字段垂直分面的"horsepower"直方图,展示不同产地(欧洲、日本、美国)汽车的功率分布。

使用分面操作符:

{
  "facet": {
    "row": {"field": "origin", "type": "nominal"}
  },
  "spec": {
    "mark": "bar",
    "encoding": {
      "x": {"bin": true, "field": "horsepower", "type": "quantitative"},
      "y": {"aggregate": "count", "type": "quantitative"}
    }
  }
}

使用行编码通道(等效但灵活性较低):

{
  "mark": "bar",
  "encoding": {
    "row": {"field": "origin", "type": "nominal"},
    "x": {"bin": true, "field": "horsepower", "type": "quantitative"},
    "y": {"aggregate": "count", "type": "quantitative"}
  }
}

网格分面

同时使用行和列编码通道可以创建网格状的小倍数图:

{
  "mark": "point",
  "encoding": {
    "row": {"field": "Cylinders", "type": "ordinal"},
    "column": {"field": "Origin", "type": "nominal"},
    "x": {"field": "Horsepower", "type": "quantitative"},
    "y": {"field": "Miles_per_Gallon", "type": "quantitative"}
  }
}

自动换行分面

当分面数量较多时,可以使用facet通道并设置columns属性实现自动换行:

{
  "mark": "point",
  "encoding": {
    "facet": {
      "field": "variety", 
      "type": "nominal",
      "columns": 4
    },
    "x": {"field": "yield", "type": "quantitative"},
    "y": {"field": "site", "type": "nominal"}
  }
}

分辨率控制(Resolve)

默认情况下,分面子图共享比例尺、坐标轴和图例。可以通过设置resolve"independent"来覆盖这一行为,使每个子图使用独立的比例尺:

{
  "facet": {...},
  "spec": {...},
  "resolve": {
    "scale": {"x": "independent", "y": "independent"}
  }
}

分面配置

可以在顶层配置对象中设置分面的全局配置:

{
  "config": {
    "facet": {
      "spacing": 20,  // 子图间距
      "columns": 3    // 默认列数
    }
  }
}

最佳实践建议

  1. 对于简单分面,使用编码通道更简洁
  2. 需要与其他视图组合或需要更复杂配置时,使用分面操作符
  3. 分类数据最适合用于分面,连续数据应先进行分箱处理
  4. 分面数量不宜过多,通常不超过20个
  5. 考虑使用columns属性控制自动换行
  6. 适当调整子图间距提高可读性

通过灵活运用Vega-Lite的分面功能,可以创建出信息丰富且易于比较的多视图可视化效果。