数据可视化基础,前端需要了解的视觉知识 | 青训营笔记

282 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的第 5 天
本篇笔记主要为数据可视化的一些视觉传达基础,以及介绍前端数据可视化的相关工具。

数据可视化基础

01. 什么是数据可视化

任何将数据转换为一种可视化呈现的方法。

image.png

数据可视化分类

根据数据可视化所处理的数据类型,可以分为两种:

  • 科学可视化:在生物、化学等科学领域,科学实验数据的直观展示
  • 信息可视化:对抽象数据(更加非结构化的数据集合)的直观展示,与科学可视化相比,更关注抽象和高维度的数据。

衍生出的跨领域方向:

  • 可视分析学:结合可视化的界面,对数据进行分析和推断。对分析结果的直观展现,以及交互式反馈。

为什么要数据可视化

  1. 记录信息
  2. 分析推理
  3. 证实假设
  4. 交流思想

02. 可视化设计原则和方法

可视化设计原则

能够正确地表达数据中的信息而不产生偏差与歧义。

常见的可视化设计错误:

透视失真

  • 如果数字是由视觉元素表示的,那么它们应该与视觉元素的感知程度成正比。
  • 使用清晰、详细和彻底的标签,以避免图形失真和含糊不清。

image.png

图形设计 & 数据尺度

图形的每一部分都会产生对其的视觉预期(visual expectation) :

  • 这些预期往往决定了眼睛实际看到的东西
  • 错误的数据洞察,产生于在图形的某个地方发生的不正确的视觉预期推断。

一个典型的例子:轴刻度,我们期望它从始至终能够保持连贯且一致。

image.png

数据上下文

通过数据可视化表达观点和结论时,一定要将数据上下文补充全面。

image.png

可视化设计原则

一个出色的可视化设计可在最短的时间内,使用最少的空间、用最少的笔墨为观众提供最多的信息内涵。

  • 准确地展示数据
  • 节省笔墨
  • 节省空间
  • 消除不必要的 “无价值” 图形
  • 在最短时间内传达最多的信息

Data-ink Ratio

最大化数据墨水占比(Data-Ink Ratio)

  • 可视化图形由墨水和空白区域构成
  • 数据墨水:可视化图形当中不可擦除的核心部分被称之为“数据墨水”
  • 擦除数据墨水将减少图形所传达的信息量
  • 数据墨水占比:可视化图形中用于展示核心数据的墨水在整体可视化所使用的墨水中的比例。

image.png

案例:

image.png

  • 绝大多数墨水都是数据墨水
    • 用于绘制散点和对应标签
  • 10% - 20% 的墨水是非数据墨水
    • 用于绘制坐标轴和刻度线
    • 并非所有的非数据墨水都没有用(例如坐标轴信息)

提高 Data-ink ratio

  • 两个擦除原则:
    • 擦除非数据墨水
    • 擦除冗余的数据墨水
  • 非数据墨水是指不能描绘有价值信息的墨水
    • 有时,非数据墨水会使数据变得混乱不堪
    • 并非所有的非数据墨水都没有用(如坐标轴信息)
  • 冗余的数据墨水描述了信息,但它重复显示了信息。

image.png

可视化设计方法

  • 最重要的是展现数据
  • 合理范围内,最大化数据墨水占比
    • 擦除非数据墨水
    • 擦除冗余的数据墨水

03. 视觉感知

可视化致力于外部认知,也就是说,怎样利用大脑以外的资源来增强大脑本身的认知能力。
视觉感知:客观事物通过人的视觉在人脑中形成的直接反映。

格式塔

格式塔的理论核心:整体决定部分的性质,部分依从于整体。

  • 结构比元素重要,视觉形象首先作为统一的整体被认知。
  • 感知的事物大于眼睛见到的事物。

格式塔理论较为系统的对人类如何发现图形元素之间的相关性进行了全面总结,被广泛的应用在了视觉设计当中。

格式塔理论

image.png

  • 就近原则(Proximity)

    • 当视觉元素在空间距离上相距较近时,人们通常倾向于将它们归为一组。
    • 将数据元素放在靠近的位置,可以突出它们之间的关联性。
  • 相似原则(Similarity)

    • 形状、大小、颜色、强度等属性方面比较相似时,这些物体就容易被看作是一个整体。
  • 连续性原则(Continuation)

    • 人们在观察事物的时候会很自然地沿着物体的边界,将不连续的物体视为连续的整体
  • 闭合原则(Closure)

    • 有些图形可能本身是不完整的或不闭合的,但主体有一种使其闭合的倾向,人们就会很容易地感知整个物体而忽略未闭合的特征。
  • 共势原则 (Common movement)

    • 如果一个对象中的一部分都向共同的方向去运动,那这些共同移动的部分就易被感知为一个整体。
  • 对称性原则(Synmmetry)

    • 对称的元素被视为同一组的一部分。
  • 图形与背景关系原则(Figure-ground)

    • 大脑通常认为构图中最小的物体是图形,而更大的物体则是背景。
    • 跟凹面元素相比,凸面元素与图形相关联更多些。

04. 视觉编码

视觉编码(Visual Encoding) 是一种:将数据信息(属性 + 值)映射成可视化元素(可视化符号 + 视觉通道)的技术。

可视化符号(Mark) :用于在可视化当中表现数据元素或元素之间的关联。

  • 当表示元素时,Mark 包括:点、线、面。
  • 当表示关系时, Mark 包括:闭包、连线

视觉通道(Channel)

  • 基于数据属性,控制可视化的符号展现样式,例如,点根据其所代表的数据属性的不同可有不同的形状与颜色。

  • 有两种类型

    • 数量通道:用于显示数据的数值属性,包括:位置、长度、角度、面积、深度、色温、饱和度、曲率、体积
    • 标识通道:用于显示数据的分类属性,包括:空间区域、色向、动向、形状

视觉编码的优先级

不同的视觉编码在表达信息的作用和能力上有不同的特性。

  • 当利用 数量通道 编码表示数值属性时:

    • 位置通道是最为精确的。
    • 其次是长度、角度、面积、深度、色温、饱和度、曲率、最后是体积。
  • 当利用 标识通道 表示分类属性时:

    • 划分空间区域最为有效。
    • 其后依次是 色向、动向、形状。

image.png

05. 面向前端的可视化工具介绍

D3

D3.js 是用于数据可视化的开源 JavaScript 函数库,被认为是最好的 JavaScript 可视化框架之一。

Vega

Vega 是一种可视化语法。通过其声明式语言,可以用 JSON 格式描述可视化的视觉外观和交互行为,并使用 Canvas 或 SVG 生成视图。

{
  "width": 400,
  "height": 200,
  "padding": 5,
​
  "data": [...
  ],
​
  "scales": [...
  ],
​
  "axes": [...
  ],
​
  "marks": [...
  ]
}

image.png

G2

G2 是一套面向常规统计图表,以数据驱动的高交互可视化图形语法,具有高度的易用性和扩展性。
使用 G2,你可以无需关注图表的各种繁琐的实现细节,一条语句即可使用 Canvas 或 SVG 构建出各种各样的可交互的统计图表。

import { Chart } from '@antv/g2';
​
const data = [
  { year: '1991', value: 3 },
  { year: '1992', value: 4 },
  { year: '1993', value: 3.5 },
  { year: '1994', value: 5 },
  { year: '1995', value: 4.9 },
  { year: '1996', value: 6 },
  { year: '1997', value: 7 },
  { year: '1998', value: 9 },
  { year: '1999', value: 13 },
];
const chart = new Chart({
  container: 'container',
  autoFit: true,
  height: 500,
});
​
chart.data(data);
​
chart.tooltip({
  showMarkers: false,
});
​
chart.interval().position('year*value');
​
chart.interaction('element-active');
​
chart.render();

image.png

ECharts

使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE9 / 10 /11,Chrome,Firefox,Safari 等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [120, 200, 150, 80, 70, 110, 130],
      type: 'bar'
    }
  ]
};

image.png