# 数据可视化原理

::: tip 前言
**一张好的图表胜过一千行数据。** 数据可视化是将抽象的数字转化为直观的视觉表达，让人能在几秒内理解数据背后的故事。从 Excel 图表到 Grafana 监控大屏，可视化无处不在。
:::

**这篇文章会带你学什么？**

学完这章后，你将获得：

- **图表选择**：根据数据目的选择最合适的图表类型
- **可视化原则**：掌握数据可视化的核心设计原则
- **仪表盘设计**：了解不同类型仪表盘的布局模式
- **工具生态**：熟悉主流可视化工具的定位和选型
- **常见陷阱**：避免误导性图表和常见的可视化错误

| 章节 | 内容 | 核心概念 |
|-----|------|---------|
| **第 1 章** | 图表类型选择 | 比较、趋势、占比、分布、关系 |
| **第 2 章** | 可视化设计原则 | 数据墨水比、一致性、可读性 |
| **第 3 章** | 仪表盘布局 | 概览型、对比型、下钻型、实时型 |
| **第 4 章** | 工具选型 | ECharts、D3、Grafana、Metabase |
| **第 5 章** | 常见陷阱 | 截断坐标轴、3D 饼图、颜色滥用 |

---

## 0. 全景图：需要可视化的原理

人类大脑处理视觉信息的速度比处理文字快得多。一张折线图能让你很快看出“上个月销售额在下降”，而同样的信息如果用表格呈现，你可能需要逐行对比才能得出结论。

可视化的核心价值：

- **发现模式**：趋势、周期、异常值在图表中一目了然
- **辅助决策**：让非技术人员也能理解数据，参与决策
- **沟通效率**：一图胜千言，减少数据解读的歧义

::: tip 可视化 ≠ 好看
可视化的目标是**传达信息**，不是炫技。一个朴素但准确的柱状图，远比一个花哨但难以理解的 3D 图表更有价值。
:::

---

## 1. 图表类型选择：用对图表讲对故事

选择图表的第一步不是“我喜欢什么图表”，而是“我想传达什么信息”。不同的数据目的对应不同的最佳图表类型。

<ChartTypeSelectorDemo />

### 图表选择速查表

| 数据目的 | 推荐图表 | 不推荐 | 原因 |
|---------|---------|--------|------|
| 比较大小 | 柱状图、条形图 | 饼图 | 人眼对长度差异比角度差异更敏感 |
| 展示趋势 | 折线图、面积图 | 柱状图 | 折线的连续性暗示时间的连续性 |
| 展示占比 | 饼图（≤5 类）、堆叠柱状图 | 3D 饼图 | 3D 透视会扭曲面积比例 |
| 展示分布 | 直方图、箱线图 | 折线图 | 分布需要看频率，不是趋势 |
| 展示关系 | 散点图、气泡图 | 柱状图 | 两个连续变量的关系需要二维空间 |

::: tip 一个简单的决策规则
- **一个变量** → 直方图（分布）或数字卡片（KPI）
- **两个变量** → 折线图（时间 vs 数值）或散点图（数值 vs 数值）
- **多个类别** → 柱状图（比较）或饼图（占比，≤5 类）
- **多维度** → 雷达图或平行坐标图
:::

---

## 2. 可视化设计原则：可视化信息编码原则

好的可视化不是“好看”，而是“好懂”。Edward Tufte 在《The Visual Display of Quantitative Information》中提出的几个经典原则，至今仍是可视化设计的重要参考。

| 原则 | 说明 | 反面案例 |
|------|------|---------|
| 数据墨水比 | 图表中用于展示数据的“墨水”占比应尽量高 | 过多的网格线、装饰性元素 |
| 最小化非数据元素 | 去除不传达信息的视觉元素 | 3D 效果、阴影、渐变背景 |
| 一致的比例尺 | 坐标轴从零开始，刻度均匀；若截断坐标轴必须明确标注 | Y 轴从 95 开始却不说明 |
| 合理的颜色使用 | 用颜色编码信息，而非装饰 | 彩虹色表示有序数据 |
| 清晰的标注 | 标题、轴标签、图例、单位缺一不可 | 没有单位、没有时间范围 |

### 2.1 数据墨水比（Data-Ink Ratio）

> 图表中用于表达数据的“墨水”占总“墨水”的比例应该尽可能高。

简单说：**删掉一切不传达信息的元素**。

| 应该删掉的 | 应该保留的 |
|-----------|-----------|
| 3D 效果、阴影、渐变 | 数据点、坐标轴标签 |
| 多余的网格线 | 关键参考线（如目标值） |
| 装饰性图标 | 图例（当有多系列时） |
| 花哨的背景色 | 清晰的标题和单位 |

### 2.2 一致性原则

- **颜色一致**：同一个维度在不同图表中用同一种颜色，如“收入”始终用蓝色
- **比例一致**：坐标轴尽量从 0 开始，除非有充分理由并且明确标注
- **时间一致**：时间轴的间隔应该均匀，不要把不等距时间点画成等距

### 2.3 可读性原则

- **标题要说结论**：不是“月度销售额”，而是“销售额连续 3 个月下降”
- **标注关键点**：在异常值、拐点处加标注，引导读者注意力
- **控制信息密度**：一张图表传达 1-2 个核心信息，不要塞太多

::: tip 颜色使用的三条规则
1. **同一指标用同一颜色**：收入在所有图表中都用蓝色，不要一会蓝一会绿
2. **有序数据用渐变色**：温度从低到高用蓝→红渐变，不要用离散色
3. **考虑色盲友好**：约 8% 的男性有红绿色盲，避免仅用红绿区分关键信息
:::

---

## 3. 仪表盘布局：不同场景，不同模式

仪表盘（Dashboard）是多个图表的有机组合。好的仪表盘不是把图表堆在一起，而是根据使用场景选择合适的布局模式。

<DashboardLayoutDemo />

### 四种常见布局模式

| 布局模式 | 核心结构 | 适用场景 | 设计要点 |
|---------|---------|---------|---------|
| 全局概览型 | KPI 卡片 + 趋势图 + 明细表 | 管理层日报、运营大盘 | 核心指标放最上方，一眼看到关键数字 |
| 对比分析型 | 左右对称布局 | A/B 测试、同环比分析 | 保持对比维度一致，突出差异 |
| 下钻分析型 | 从汇总到明细逐层展开 | 销售分析、用户行为分析 | 支持点击交互，逐层深入 |
| 实时监控型 | 大数字 + 实时曲线 + 告警状态 | 双十一大屏、服务器监控 | 自动刷新，深色背景，适合投屏 |

### 仪表盘设计的 5 个原则

1. **先问“谁在看”**：CEO 看战略指标，运营看过程指标，工程师看技术指标
2. **5 秒规则**：用户应该在 5 秒内理解仪表盘的核心信息
3. **信息层次**：最重要的放左上角，次要的放下方
4. **减少滚动**：一屏展示核心内容，避免用户需要滚动才能看到关键数据
5. **留白**：不要塞满每一寸空间，适当留白让视觉更舒适

::: tip 仪表盘 vs 报表
- **仪表盘**：实时/准实时，交互式，面向监控和快速决策
- **报表**：定期生成（日/周/月），静态，面向详细分析和存档

两者不是替代关系，而是互补关系。仪表盘发现问题，报表深入分析。
:::

---

## 4. 工具选型：从代码库到 BI 平台

可视化工具可以分为三个层次：代码级图表库、数据分析图表库、BI 平台。选择哪个取决于需求复杂度、交互要求和团队技术能力。

### 4.1 代码级图表库

| 工具 | 语言/平台 | 特点 | 适用场景 |
|------|----------|------|---------|
| ECharts | JavaScript | 开箱即用，图表类型丰富，中文文档完善 | 业务系统内嵌图表 |
| D3.js | JavaScript | 底层灵活，可定制任何可视化效果 | 高度定制化的数据可视化 |
| Chart.js | JavaScript | 轻量简单，上手快 | 简单图表需求 |
| Matplotlib | Python | 科学计算标准库，静态图表 | 数据分析、论文图表 |
| Plotly | Python/JS | 交互式图表，支持 3D | 数据探索、Jupyter Notebook |

### 4.2 BI 平台（无代码/低代码）

| 工具 | 定位 | 核心优势 | 适用团队 |
|------|------|---------|---------|
| Grafana | 监控可视化 | 时序数据支持好，告警集成 | 运维/SRE 团队 |
| Metabase | 轻量 BI | 开源免费，SQL 即可出图 | 中小团队快速搭建 |
| Apache Superset | 企业 BI | 开源，支持大数据源 | 有数据团队的公司 |
| Tableau | 商业 BI | 拖拽式操作，可视化效果好 | 业务分析师 |
| Power BI | 商业 BI | 与微软生态集成好 | 使用微软技术栈的企业 |

::: tip 选型建议
- **开发者做产品内嵌图表** → ECharts（中文生态好）或 Chart.js（简单场景）
- **数据分析师做探索分析** → Plotly + Jupyter 或 Metabase
- **运维监控大屏** → Grafana（事实标准）
- **业务团队自助分析** → Metabase（开源）或 Tableau（商业）
- **需要高度定制** → D3.js（学习曲线陡峭，但可塑性最强）
:::

---

## 5. 常见陷阱：这些图表在骗你

数据可视化是一把双刃剑：用得好能揭示真相，用得不好会制造错觉。以下是最常见的可视化陷阱，每个数据从业者都应该能识别。

### 5.1 截断坐标轴

把 Y 轴的起点从 0 改成一个较大的数字，会让微小的差异看起来像巨大的变化。

| 场景 | 真实差异 | 视觉感受 |
|------|---------|---------|
| Y 轴从 0 开始 | A 产品 98 分，B 产品 95 分 | 差距很小 |
| Y 轴从 90 开始 | 同样的数据 | A 看起来是 B 的好几倍 |

**什么时候可以截断？** 当数据的绝对值很大但变化很小时（如股价从 100 到 105），截断是合理的，但必须明确标注。

### 5.2 3D 饼图的透视陷阱

3D 透视会让靠近观察者的扇区看起来更大。一个 25% 的扇区在 3D 视角下可能看起来像 35%。

**解决方案**：永远不要用 3D 饼图。用普通饼图或环形图，或者干脆用柱状图。

### 5.3 颜色滥用

| 错误做法 | 正确做法 |
|---------|---------|
| 用红绿表示数据 | 用蓝橙等色盲安全配色 |
| 每个类别用不同颜色 | 同一系列用同色系深浅变化 |
| 用颜色编码连续数据但不加图例 | 始终提供颜色图例和数值标注 |
| 背景色和数据色对比度不够 | 确保 WCAG AA 级对比度 |

### 5.4 其他常见错误

| 陷阱 | 问题 | 修复 |
|------|------|------|
| 双 Y 轴 | 两个不相关的指标共享 X 轴，暗示因果关系 | 拆成两张图，或明确说明无因果 |
| 面积误导 | 用圆的半径而非面积表示数值 | 数值翻倍时面积翻倍，不是半径翻倍 |
| 时间轴不均匀 | 1 月、3 月、12 月的间距一样 | 按实际时间比例排列 |
| 过多类别 | 饼图有 15 个扇区 | 超过 5 个类别就用柱状图或合并“其他” |

::: tip 可视化的道德准则
可视化的目的是**帮助理解**，不是**操纵认知**。每次做图表时问自己：

- 如果我是读者，这张图会不会让我产生错误的结论？
- 我是否隐藏了不利的数据？
- 坐标轴、比例、颜色是否公正地呈现了数据？
:::

---

## 总结

数据可视化是数据价值传递的“最后一公里”。再好的分析，如果不能被正确理解，就等于没有分析。

回顾本章的关键要点：

1. **选对图表**：根据数据目的（比较、趋势、占比、分布、关系）选择图表类型
2. **设计原则**：高数据墨水比、一致性、可读性是三大核心原则
3. **仪表盘布局**：概览型、对比型、下钻型、实时型四种模式覆盖大部分场景
4. **工具选型**：从 ECharts 到 Grafana，根据团队能力和需求复杂度选择
5. **避免陷阱**：截断坐标轴、3D 饼图、颜色滥用是最常见的误导手段

## 延伸阅读

- [The Visual Display of Quantitative Information](https://www.edwardtufte.com/tufte/books_vdqi) - Edward Tufte 的可视化经典
- [ECharts 官方文档](https://echarts.apache.org/zh/index.html) - 最流行的中文图表库
- [D3.js](https://d3js.org/) - 强大的底层可视化库
- [Grafana](https://grafana.com/) - 监控可视化事实标准
- [From Data to Viz](https://www.data-to-viz.com/) - 图表类型选择决策树
- [ColorBrewer](https://colorbrewer2.org/) - 色盲安全的配色方案工具
