拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Vega 平行坐标图实战:多维汽车数据的 axes-offset 折线布局规范全解析

数据可视化【免费下载链接】vegaA visualization grammar.项目地址https://gitcode.com/gh_mirrors/ve/vega点击查看免费下载平行坐标Parallel Coordinates是一种用于多维数据可视化的经典图表每个维度占据一条平行的垂直轴每条数据记录则被绘制成一条横穿所有轴的折线通过折线的走向与交叉模式直观呈现变量之间的相关关系。本指南以 Vega 仓库中的官方示例 parallel-coordinates.vg.json 为主体逐段拆解其数据清洗、多重尺度定义、轴定位技巧与嵌套折线编码帮助读者掌握用 Vega 声明式语法实现任意多维数据集平行坐标图的方法。一、示例概览7 维汽车统计数据的平行坐标仓库中的该示例文档入口见 docs/examples/parallel-coordinates.md将7 个维度的汽车统计数据汽缸数、排量、车重、马力、加速性能、每加仑英里数、年份同时展现在一张图上共定义了 7 个垂直轴与 7 个线性比例尺并通过一个嵌套 group 标记一次性渲染所有数据记录的折线。平行坐标的核心读图逻辑是同一轴维度上的位置代表该变量的取值相邻轴之间折线的斜率与交叉密度则反映两个变量之间的相关程度——折线交叉密集往往暗示负相关而不同轴序排列可能暴露出不同的数据模式。Vega 示例文档原文也明确指出line crossings 指示负相关改变轴顺序可能揭示不同的关注模式。二、数据准备过滤缺失值并统一年份格式平行坐标对数据完整度比较敏感——某个维度的缺失值会直接导致折线在该轴中断开。因此示例的第一步就是对cars数据做清洗。数据源为仓库内的 docs/data/cars.json共 4468 行记录包含Name、Miles_per_Gallon、Cylinders、Displacement、Horsepower、Weight_in_lbs、Acceleration、Year、Origin等字段。{ name: cars, url: data/cars.json, format: { type: json, parse: {Year: date:%Y-%m-%d} }, transform: [ { type: filter, expr: datum.Horsepower datum.Miles_per_Gallon }, { type: formula, as: Year, expr: isNumber(datum.year) ? datum.year : year(datum.Year) } ] }两个关键 transform 的作用filter 变换保留Horsepower马力与Miles_per_Gallon每加仑英里数均非空的记录剔除因缺失导致折线无法贯通的样本。formula 变换兼容两种年份字段形态——若已有数值型datum.year直接使用否则调用表达式函数year()从日期型Year字段中提取年份。isNumber与year均为 Vega 表达式expression内置函数这类函数的实现与注册可参见 packages/vega-functions/src 下对应模块。数据清洗之后示例又用静态values定义了一个fields数据集按展示顺序列出全部 7 个维度名作为后续轴布局与折线绘制的维度清单{ name: fields, values: [ Cylinders, Displacement, Weight_in_lbs, Horsepower, Acceleration, Miles_per_Gallon, Year ] }三、尺度定义一根横轴 七根竖轴平行坐标图的尺度设计是整张图的骨架需要一个序数离散尺度把 7 个维度名映射到水平位置再为每个维度各配一个线性尺度把数值映射到垂直位置。3.1 维度横轴point 尺度{ name: ord, type: point, range: width, round: true, domain: {data: fields, field: data} }type: point点尺度将fields数据集中 7 个维度名均匀分布到range: width即画布宽度上。从 Vega 源码看point 尺度本质上是paddingInner(1)的 band 尺度变体见 packages/vega-scale/src/scales/scaleBand.js#L189-L191 中的point()工厂函数以及pointish对padding语义的改写scaleBand.js#L176-L187。round: true将输出位置取整到整数像素避免折线出现亚像素模糊。domain取自fields数据的data字段即维度名字符串。3.2 各维度竖轴七个 linear 尺度每个维度一个独立线性尺度模式完全一致仅domain字段不同例如{ name: Horsepower, type: linear, range: height, zero: false, nice: true, domain: {data: cars, field: Horsepower} }两个细节值得注意zero: false平行坐标中各维度量纲差异巨大汽缸数是个位数、车重则是数千磅强制从 0 开始会让绝大多数折线挤压在轴的一端。关闭zero后各轴独立缩放到自己的数据极值区间折线才能充分铺满整个轴。nice: true让每个轴的范围取整到好看的刻度值如 10、50 的整数倍保证坐标轴刻度标签整洁。七个尺度分别为Cylinders、Displacement、Weight_in_lbs、Horsepower、Acceleration、Miles_per_Gallon、Year全部使用range: height作为输出范围。四、轴定位技巧用 scale 信号化 offset 把 7 根轴摆到 7 个维度位置这是本示例最精妙也最值得学习的一处。Vega 默认的轴axis要么依附于某个 scale 自动定位要么通过数值offset平移。而平行坐标需要的是每个维度的轴其水平位置由ord尺度在该维度名上的取值决定。示例的做法是给每个轴配置一个信号化的offset——它不是一个常量而是一个指向ord尺度的表达式对象{ orient: left, zindex: 1, scale: Cylinders, title: Cylinders, offset: {scale: ord, value: Cylinders, mult: -1} }这里offset的计算语义是scale(ord, Cylinders) * -1即把该轴沿水平方向向左平移一个维度位置。由于每个轴的 scale 不同Vega 会为每一根轴分别求值该 offset从而把 7 根轴依次错开摆放到各自维度的横坐标上。该语法在 Vega 规范中被定义为可解析为带scale/value/mult字段的对象参见 packages/vega-schema/src/encode.js#L44-L45 中required(scale, value)的引用定义轴解析器在 packages/vega-parser/src/parsers/axis.js#L101-L102 中读取offset配置缺失时默认 0。各轴的其余配置orient: left轴刻度、标签朝左绘制zindex: 1轴置于数据折线上层避免被折线遮挡title显示维度名Year轴额外设置format: d让刻度标签以整数年份显示不出现小数。轴定义支持的全部可配置属性offset、format、title*、label*、tick*、grid*、domain*等可在模式源码 packages/vega-schema/src/axis.js 中查阅其中offset被声明为numberValue类型axis.js#L58即既可以是数字也可以是可求值的信号引用。五、折线绘制嵌套 group 与父子字段引用数据折线通过一个外层按记录迭代、内层按维度迭代的双重嵌套结构实现{ type: group, from: {data: cars}, marks: [ { type: line, from: {data: fields}, encode: { enter: { x: {scale: ord, field: data}, y: { scale: {datum: data}, field: {parent: {datum: data}} }, stroke: {value: steelblue}, strokeWidth: {value: 1.01}, strokeOpacity: {value: 0.3} } } } ] }逐层拆解其运行机制外层 groupfrom: {data: cars}表示对 4468 条汽车记录各生成一个 group 实例每个实例代表一条数据折线。内层 line 标记每个 group 内再迭代fields数据集的 7 个维度名从而为这条记录在 7 个轴上各生成一个折线顶点。x 编码{scale: ord, field: data}—— 用ord尺度把当前维度名data字段映射为横坐标。y 编码父子字段引用的典型用法scale: {datum: data}—— 比例的名称是动态的取当前数据项即维度名作为尺度名例如遍历到Horsepower就使用Horsepower尺度field: {parent: {datum: data}}—— 字段名也是动态的{parent: ...}表示取父级 group 的数据即该条汽车记录{datum: data}表示取该父记录的、名为当前维度名的字段值。合起来即在当前维度对应的尺度上取当前汽车记录在该维度上的取值。这种scale引用与parent字段引用在 Vega 规范中均有专门定义可参见 packages/vega-schema/src/encode.js#L72-L86 附近对fieldRef/parent/scaleRef的声明。样式stroke: steelblue、strokeWidth: 1.01、strokeOpacity: 0.3。4468 条记录全部以半透明细线叠加交叉处颜色叠加变深从而自然呈现密度信息——这也是平行坐标图中线多而不糊的经典处理手法。六、全局配置轴标题的定制摆放示例在顶层config中针对所有 Y 轴统一调整了标题位置config: { axisY: { titleX: -2, titleY: 410, titleAngle: 0, titleAlign: right, titleBaseline: top } }其效果是把轴的标题文本维度名从默认的旋转 90° 改为水平摆放并固定到画布左下角的 (x-2, y410) 附近避免 7 个长维度名在轴旁竖排造成遮挡。注意height: 400加上padding: 5画布总高为 410titleY: 410正是贴合画布底边。顶层画布尺寸为width: 700、height: 400、padding: 5。七、完整规范与运行方式将上文各部分拼接即得到完整的官方示例 docs/examples/parallel-coordinates.vg.json。运行方式有两种交互式预览该示例由 docs/examples/parallel-coordinates.md 的 front-matter 声明spec: parallel-coordinates配合仓库 docs 站点Jekyll的 example 布局渲染可在浏览器中直接查看并支持 hover 探查本地渲染使用 packages/vega-cli 提供的命令行工具将规范与数据置于仓库相对路径下执行渲染如vg2svg docs/examples/parallel-coordinates.vg.json或用vg2png输出位图。规范中数据 URLdata/cars.json对应的实体文件即 docs/data/cars.json。八、小结把平行坐标模式迁移到自己的数据总结这个示例中可复用的四步方法论清洗用filter剔除关键维度缺失的记录必要时用formula统一字段格式与类型定义双组尺度一个point尺度负责维度名的水平布局每维度一个linear尺度记得zero: falsenice: true负责数值垂直映射摆放轴利用offset: {scale: ord, value: 维度名, mult: -1}的信号化偏移把 N 根轴精确放到 N 个维度位置并用zindex: 1保证轴在折线上层绘制折线外层 group 按记录迭代、内层 line 按维度迭代配合动态scale名与{parent: ...}字段引用完成多维取值映射最后用半透明细线叠加呈现密度。换用任何多维表格数据如仓库 docs/data 下的其他数据集只需替换fields维度清单、数据源与各 linear 尺度的 domain 字段即可快速生成自己的平行坐标图。若需要深入了解轴与尺度的底层解析逻辑可继续阅读 packages/vega-parser/src/parsers/axis.js、packages/vega-parser/src/parsers/scale.js 与 packages/vega-scale/src/scales/scaleBand.js。赞分享数据可视化【免费下载链接】vegaA visualization grammar.项目地址https://gitcode.com/gh_mirrors/ve/vega点击查看免费下载相关推荐Altair平行坐标图多维数据分析的终极可视化指南Altair平行坐标图多维数据分析的终极可视化指南 Altair是一个声明式统计可视化库专为Python设计让数据科学家和分析师能够轻松创建复杂而美观的可数据可视化为什么Ceedling是嵌入式C开发的必备工具5大核心优势解析为什么Ceedling是嵌入式C开发的必备工具5大核心优势解析 Ceedling作为一款专为C项目打造的单元测试和构建系统为嵌入式开发提供了一站式解决方案。开发工具嵌入式Vega 规范解析器 vega-parser从 Vega JSON 规范到响应式数据流图与配置主题化实战Vega 规范解析器 vega parser从 Vega JSON 规范到响应式数据流图与配置主题化实战 导读 vega parser 是 Vega 可视化语数据可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门