mcpField
D
data-visualization

data-visualization

github.com/ntcoding数据与数据库358123 次安装32 周前更新
代码仓库

关于 data-visualization

data-visualization 是面向开发者和数据从业者的可视化设计技能,涵盖图表、图形和仪表板。它提供编码方式、图表选择、布局、渲染、交互及无障碍设计指导,并介绍成熟库与算法。

主要功能

  1. 01视觉编码与图表选择
  2. 02交互和注释模式
  3. 03图布局库选择指导
  4. 04渲染与性能阈值
  5. 05无障碍和配色指导

适用场景

  1. 01为数据或问题选择合适图表
  2. 02设计交互式图形和仪表板
  3. 03提升可视化性能与无障碍性

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ntcoding/claude-skillz --skill data-visualization

安装后在 Claude Code 中输入/data-visualization确认已加载。

详细介绍

数据可视化

可视化是一种沟通方式。每个视觉元素都必须服务于理解。

关键规则

🚨 使用成熟的算法。 图布局、树布局、空间索引——这些问题已有解决方案。在自定义实现前,先了解 dagre、d3-force 和 ELK.js。

🚨 根据感知准确度选择编码方式。 位置优于长度,长度优于角度,角度优于面积,面积优于颜色。优先使用条形图,其次是饼图,再次是气泡图。

🚨 绝不要只依赖颜色。 8% 的男性有色盲。应使用形状、图案或标签作为备用编码。

🚨 根据规模匹配渲染方式。 <1000 个元素用 SVG,1000-10000 个用 Canvas,>10000 个用 WebGL。


1. 视觉编码

图形标记与视觉通道

图形标记是表示数据的几何图元:

  • 点(散点图、点图)
  • 线(折线图、网络边)
  • 面(条形图、面积图、地图)

视觉通道是应用于图形标记的视觉属性:

  • 位置(x、y 坐标)
  • 尺寸(长度、面积、体积)
  • 颜色(色相、饱和度、明度)
  • 形状(圆形、正方形、三角形)
  • 方向(角度、斜率)
Cleveland 与 McGill 层级(1984)

按感知准确度排列的视觉编码:

  1. 沿共同刻度的位置(最准确)
  2. 非对齐刻度上的位置
  3. 长度
  4. 角度/斜率
  5. 面积
  6. 体积
  7. 颜色饱和度/色相(最不准确)

启示: 条形图(位置)> 饼图(角度)> 气泡图(面积)

前注意属性

无需有意识处理即可在 <250ms 内感知的属性:

  • 颜色(色相、饱和度)
  • 形态(方向、长度、宽度、尺寸、形状)
  • 空间位置
  • 动态

将前注意属性用于最重要的数据——它们会自动“脱颖而出”。

不同数据类型的通道有效性
数据类型最佳通道
定量位置、长度、角度、面积
有序位置、密度、饱和度
分类形状、色相、空间区域

2. 交互设计

Shneiderman 准则(1996)

“先看全貌,再缩放和筛选,最后按需查看细节”

  1. 全貌 — 展示整个数据集,建立上下文
  2. 缩放与筛选 — 降低复杂度,聚焦于子集
  3. 按需查看细节 — 工具提示、点击展开、逐层深入
交互模式
模式使用场景
刷选与联动在协调视图之间交叉高亮
焦点+上下文鱼眼镜头、按需查看细节面板
直接操作拖动节点、调整元素大小、重新排序
动画过渡帮助用户跟踪不同状态之间的变化
平移与缩放浏览大型可视化
筛选将数据缩减到相关子集
选择高亮特定数据点

3. 图表选择

按问题类型选择
问题图表类型原因
数值如何比较?条形图位置编码最准确
随时间发生了怎样的变化?折线图展示趋势,可处理多个数据点
分布情况如何?直方图、箱线图展示离散程度、异常值和形状
存在怎样的关系?散点图揭示相关性和聚类
各部分如何构成整体?堆叠条形图、矩形树图展示构成
存在哪些连接?网络图、桑基图展示关系和流向
层级结构如何?树图、旭日图、矩形树图展示父子结构
它在哪里?分级统计地图、符号地图提供地理上下文
按数据量选择
数据量处理方式
<20 个点简单图表、直接标注
20-500 个标准可视化
500-5000 个考虑聚合、筛选
5000+ 个必须聚合,或使用 Canvas/WebGL
常见反模式
  • ❌ 饼图超过 5 个扇区(应使用条形图)
  • ❌ 缺乏充分理由的 3D 图表
  • ❌ 双轴使用无关刻度(会造成误导)
  • ❌ 条形图的基线不为零(会扭曲感知)
  • ❌ 截断坐标轴但未明确标示

4. 颜色

调色板类型
类型用例示例
顺序型从低到高的值Blues、Greens、Viridis
发散型值从中点向两侧发散RdBu、BrBG、Spectral
分类型不同类别Set2、Tableau10、Category10
色盲友好性
  • 8% 的男性、0.5% 的女性存在色觉缺陷
  • 绝不要只依赖颜色——应使用形状、图案和标签
  • 色盲友好的顺序型调色板:viridis、cividis、plasma
  • 色盲友好的分类型调色板:ColorBrewer 的色盲友好选项
  • 使用 Coblis、Sim Daltonism、Chrome DevTools 进行测试
感知均匀性
  • 避免使用彩虹色图(jet)——感知上的色阶不均匀
  • 顺序型数据使用 viridis、parula、cividis
  • 这些调色板可确保不同值之间的感知距离相等
颜色指南
  • 文本对比度至少为 4.5:1(WCAG AA)
  • UI 组件对比度至少为 3:1
  • 不同的分类颜色最多使用 7-10 种
  • 使用饱和度或亮度变化来突出重点

5. 布局算法

🚨 在实现任何布局算法之前,先检查是否已有现成的库。

算法 → 库对应关系
问题算法库
分层图/DAGSugiyama(1981)dagre、ELK.js
力导向网络Fruchterman-Reingold(1991)d3-force、Cytoscape.js
树布局Reingold-Tilford(1981)d3-hierarchy
矩形树图Squarified(2000)d3-hierarchy、ECharts
圆形打包Wang(2006)d3-hierarchy
桑基图—d3-sankey
弦图—d3-chord
大型图(10k+)WebGL + 空间索引Sigma.js、G6、deck.gl
空间查询四叉树、R 树d3-quadtree、rbush
最小化边交叉Barth(2002)dagre/ELK 内置
布局的适用场景
布局最适用场景
Sugiyama(dagre)流程图、依赖关系图、有方向的 DAG
力导向布局社交网络、有机关系、探索
树形布局每个节点只有一个父节点的层级结构
矩形树图带有定量值的层级结构
环形布局突出中心节点、环状结构
矩阵布局边会重叠的稠密图

这些问题已经有成熟的解决方案。绝不要从头实现。


6. 渲染与性能

渲染技术阈值
<1000 elements    → SVG
                    - DOM events work naturally
                    - Accessibility (ARIA) supported
                    - Crisp at any zoom level
                    - CSS styling

1000-10000        → Canvas
                    - Batch rendering
                    - Manual hit testing required
                    - Lower memory footprint
                    - requestAnimationFrame for animation

>10000            → WebGL
                    - GPU acceleration
                    - Sigma.js, deck.gl, regl
                    - Complex setup
                    - Limited text rendering
性能模式
模式适用场景
Web Workers布局计算(绝不阻塞主线程)
空间索引使用四叉树/R 树进行命中检测
细节层次简化远处或较小的元素
视口裁剪仅渲染可见元素
防抖开销较大的交互(缩放、筛选)
虚拟化图表组件的长列表
聚合数据点过多,无法逐个渲染
反模式
  • ❌ 5000 个 SVG 节点(改用 Canvas)
  • ❌ 在主线程上计算布局
  • ❌ 不使用空间索引进行命中测试
  • ❌ 渲染屏幕外的元素
  • ❌ 单独为数千个元素添加动画

7. 库

图布局
库最适用场景说明
dagre分层 DAG、流程图Sugiyama 算法,默认配置表现良好
dagre-d3dagre + D3 渲染SVG 输出
ELK.js复杂布局、复合图Eclipse Layout Kernel,高度可配置
d3-force有机网络Fruchterman-Reingold,可自定义力
Cytoscape.js图分析与可视化算法库丰富
Sigma.js大型图(10k+)WebGL 渲染
G6/AntV企业级图功能全面,中文生态
vis-network快速原型API 简单,可定制性有限
图表
库最适用于说明
D3.js自定义、高交互性图表底层库,提供最大控制权
Observable Plot快速探索由 D3 团队开发,默认设置出色
RechartsReact 集成声明式、可组合
VictoryReact 集成支持动画
ECharts功能丰富的仪表板移动端体验出色,支持大型数据集
Vega-Lite图形语法声明式 JSON 规范
Chart.js简单图表易于设置,自定义能力有限
Plotly科学可视化支持 3D 和交互
何时使用 D3,何时使用更高级别的库

使用 D3 的场景:

  • 需要完全控制渲染
  • 构建新颖或自定义可视化
  • 与现有 SVG/Canvas 代码集成
  • 对性能要求严苛,需要自定义优化

使用更高级别库的场景:

  • 标准图表类型已足够
  • 重视更快的开发速度
  • 团队对 D3 不太熟悉
  • 需要内置的响应式布局或动画

8. 组合与布局

项目组合(仪表板层级)
  • 视觉层级 — 引导视线优先关注最重要的内容
  • 网格系统 — 对齐元素,保持整体协调
  • 分组 — 将相关可视化放在一起
  • 留白 — 留出呼吸空间,而不是浪费空间
  • 阅读流 — 面向西方受众时采用 Z 形或 F 形布局
图表组合(单个图表)
元素指南
标题清晰、描述性强;放在左上方或上方居中
副标题补充背景信息;字号小于标题,放在标题下方
坐标轴标注单位;刻度间隔应有实际意义
图例尽可能嵌入图表;内容复杂时放在图表外
宽高比会影响斜率感知;趋势图采用 45° 倾斜
边距为标签留出足够空间;各图表间保持一致
宽高比指南
  • 折线图: 趋势图约采用 16:9(倾斜至 45°)
  • 条形图: 取决于条形数量
  • 散点图: 通常采用正方形(1:1),以便观察相关性
  • 地图: 保持地理比例

9. 注释

注释类型
类型用途
标题说明“是什么”——标识可视化内容
副标题补充背景信息和数据来源
图注说明“意味着什么”——关键洞察或结论
坐标轴标签变量名称和单位
图例解读颜色、形状和大小的映射关系
标注突出显示特定数据点
参考线基准值、目标值、平均值
来源引用数据出处
最佳实践
  • 标注洞察,而不只是数据 — 使用“销售额在第 3 季度达到峰值”,而不只是“随时间变化的销售额”
  • 少量使用标注 — 最多突出显示 1–3 个关键点
  • 直接标注 — 尽可能将标签嵌入图表(而不是使用单独的图例)
  • 提供背景信息 — 基准值、历史参考值、目标值
  • 分层呈现信息 — 显示概览,交互时呈现细节
文本层级
  1. 标题(字号最大、字重最粗)
  2. 副标题/图注
  3. 坐标轴标题
  4. 刻度标签
  5. 注释
  6. 来源(字号最小)

10. 无障碍

WCAG 要求
  • 最低 AA 级(优先达到 AAA 级)
  • 普通文本的对比度至少为 4.5:1
  • 大号文本和 UI 组件的对比度至少为 3:1
  • 不得仅依靠颜色传达信息
键盘导航
  • 使用 Tab 键遍历交互元素
  • 使用方向键遍历数据点
  • 使用 Enter/Space 键进行选择
  • 使用 Escape 键取消/关闭
屏幕阅读器支持
<svg role="img" aria-labelledby="chart-title chart-desc">
  <title id="chart-title">Monthly Sales 2024</title>
  <desc id="chart-desc">Bar chart showing sales increasing from $10M in January to $15M in December</desc>
</svg>
  • 使用 ARIA 标签和角色
  • 提供文本替代内容
  • 使用实时区域播报动态更新
  • 按照符合逻辑的阅读顺序进行结构化
替代呈现方式
  • 数据表格 — 为所有图表提供备用方案
  • 文本摘要 — 描述关键洞察
  • 声化 — 为时间序列提供音频呈现
  • 触觉图形 — 满足实体无障碍需求

11. 反模式摘要

设计反模式
反模式为什么不合适应该怎么做
3D 图表会扭曲感知使用 2D 图表
扇区数 >5 的饼图难以比较使用条形图
两个无关的坐标轴会造成误导性关联使用独立图表
非零基线会夸大差异从零开始
彩虹色映射感知均匀性差使用 viridis
仅用颜色编码无法满足色盲用户的需求添加形状或图案
图表杂物会分散对数据的注意力移除装饰
点位重叠会掩盖数据密度聚合数据或添加抖动
实现反模式
反模式为什么不合适应该怎么做
自定义图布局重复解决已有问题使用 dagre/ELK
5000 个 SVG 节点性能不佳使用 Canvas
在主线程上进行布局会阻塞 UI使用 Web Worker
没有空间索引命中检测速度慢使用四叉树
渲染屏幕外的内容浪费计算资源进行视口剔除

12. 学术基础

奠基性论文
论文年份贡献
Cleveland 与 McGill《Graphical Perception》1984视觉编码层级
Shneiderman《The Eyes Have It》1996概览、缩放、筛选、细节原则
Gansner 等人《Drawing Directed Graphs》1993dagre 的基础
Fruchterman 与 Reingold《Force-directed Placement》1991d3-force 的基础
Sugiyama 等人《Hierarchical Systems》1981分层图布局
Barth 等人《Bilayer Cross Counting》2002边交叉最小化
Brewer《Color Use Guidelines》1994ColorBrewer 调色板
必备资源
资源类型重点
ColorBrewer (colorbrewer2.org)工具无障碍调色板
From Data to Viz (data-to-viz.com)指南图表选择决策树
Visualization Analysis & Design(Munzner)教科书全面的理论
Data Visualisation(Kirk)教科书面向实践者的指南
Visual Display of Quantitative Information(Tufte)教科书数据墨水比、图表杂物
D3 Gallery (observablehq.com/@d3/gallery)示例实现模式

总结

🚨 实现可视化之前:

  1. 你要回答什么问题? → 选择图表类型
  2. 数据量有多大? → 选择渲染技术
  3. 是否已有成熟算法? → 使用相关库
  4. 是否满足无障碍要求? → 颜色、键盘、屏幕阅读器
  5. 是否遵循感知方面的最佳实践? → 编码层级

评论

支持 Markdown