Data-Science-For-Beginners 第 13 课:如何打造有意义且不欺骗读者的数据可视化
2026/9/10 11:37:16 网站建设 项目流程

Data-Science-For-Beginners 第 13 课:如何打造有意义且不欺骗读者的数据可视化

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

数据可视化的目标不是"画得好看",而是"讲真话"——正确选择图表类型、避开误导性表达、妥善运用颜色与样式,并借助动画和 3D 等现代手段让数据自己说话。本篇基于 Data-Science-For-Beginners 课程第 13 课(Meaningful Visualizations)展开,在梳理完整方法论之后,深入解读仓库中配套的 Vue.js + D3 网络可视化实战项目,让你既能建立防骗的可视化思维,也能动手把一本小说"画"成一张可交互的社交网络图。

先选对图表:一张表解决"该用什么图"

在动手画图之前,先回答一个问题:你究竟想用数据证明什么?前几课已经用 Matplotlib 和 Seaborn 练习过各种图表,本课则把"问题 → 图表类型"的对应关系整理成了一张速查表,这是本课的核心决策工具:

你的需求应选用的图表
展示随时间变化的趋势折线图(Line)
比较类别柱状图(Bar)、饼图(Pie)
比较总量饼图(Pie)、堆叠柱状图(Stacked Bar)
展示关系散点图(Scatter)、折线图(Line)、分面图(Facet)、双折线图(Dual Line)
展示分布散点图(Scatter)、直方图(Histogram)、箱线图(Box)
展示占比饼图(Pie)、环形图(Donut)、华夫饼图(Waffle)

✅ 需要注意:取决于数据的组成结构,你可能需要先把文本格式转换为数值格式,图表才能正确支持其显示。这是数据准备阶段(见本课程第 08 课数据预处理)与可视化阶段之间必不可少的衔接步骤。

图表类型选错了,即使数据本身完全真实,呈现出来的结论也可能是错误的——这一点在下一节会反复出现。

警惕欺骗性图表:眼睛很容易被骗

即使数据科学家谨慎地"为正确的数据选择了正确的图表",仍然存在大量让数据"证明某个观点"的手段,而这些手段往往以牺牲数据真实性为代价。本课通过四个真实案例总结了最常见的欺骗套路:

  • 反转 X 轴:一张按日期绘制的图若将 X 轴反转,会呈现与事实相反的结论——时间轴从左到右反而"倒退"了。
  • 重排日期制造假趋势:有一张关于 COVID 病例数的图表,把各郡县的数据按时间重排,使人的视线被引向右侧,从而得出"病例随时间下降"的结论;仔细核对日期就会发现,这个下降趋势是人为制造出来的。
  • 颜色 + 反转 Y 轴双重误导:一个关于枪支立法的经典案例,通过颠倒 Y 轴方向,让"立法通过后枪击死亡激增"的事实看起来像是"下降",颜色又进一步强化了错误暗示。
  • 操纵比例:通过扭曲饼图或柱状图的面积比例,可以达到近乎荒诞的幽默效果,但本质上仍是误导。

此外,"拿不可比的东西做比较"也是一种常见的可疑手法:例如把缅因州的离婚率和人造黄油消费量放在一起"证明"它们的相关性——这类"虚假相关"(spurious correlations)在网络上比比皆是。理解这些把戏的意义在于:即使数据科学家动机良好,选错图表类型(例如用包含过多类别的饼图)本身就可能具有欺骗性。因此,"选对图表"不仅是审美问题,更是伦理问题。

用颜色传递正确的含义

在"Florida gun violence"一图中可以看到,颜色能为图表增加额外一层语义——尤其是当你不借助自带经过验证的调色板的库来手工绘制图表时。手工选色前,值得花一点时间学习色彩理论。同时必须记住:可访问性(accessibility)是可视化的关键维度,你的部分用户可能是色盲,图表必须对视觉障碍用户也可读。

颜色还会携带你可能没预料到的含义。例如"身高"图表中把一组数据标成"粉色"(pink ladies),便附带了明显的"女性化"暗示,加重了图表本身的怪异感。颜色的象征意义在世界各地存在差异,且会随色相变化而改变,但一般意义上的颜色含义包括:

颜色含义
红色力量
蓝色信任、忠诚
黄色快乐、谨慎
绿色生态、幸运、嫉妒
紫色快乐
橙色活力

如果你需要为图表自定义颜色,务必同时满足两点:图表对色盲用户可读,且所选颜色与你想要传达的含义一致。

提升图表的可读性:样式即信息

图表如果不可读,就没有意义。本课给出几条可落地的样式规范:

  • 调整宽高比例:让画布尺寸与数据规模匹配;如果某个变量需要展示 50 个取值(比如 50 个州),尽量把它们竖排在 Y 轴上,避免生成需要横向滚动的图表。
  • 标注坐标轴、必要时给出图例、提供 tooltip:三者共同帮助读者理解数据细节。
  • 文本轴内容过长时倾斜文字:当 X 轴上的文本数据冗长时,倾斜标签可以显著改善可读性。

如果你的数据支持 3D 显示,还可以借助 Matplotlib 的mpl_toolkits.mplot3d工具包制作精良的三维图。在 R 生态中,plot3D 也提供 3D 绘图能力。仓库中3-Data-Visualization/R/13-meaningful-vizualizations/目录即为本课的 R 版本,可对照参考。需要注意的是:3D 本身也可能成为"误导"的来源,使用前应确认数据确实需要第三个维度。

动画与 3D:让可视化动起来

今天最优秀的数据可视化中有相当一部分是动画交互式的。例如 Shirley Wu 用 D3 创作的 "film flowers"(每朵花代表一部电影的视觉化),以及 Guardian 的 "Bussed Out"——一个结合 Greensock 与 D3、采用 scrollytelling(滚动叙事)文章格式的交互式作品,用来展示纽约如何把无家可归者运送出城。

本课不要求深挖这些重量级库的细节,而是给出了一个恰到好处的练习:在一个 Vue.js 应用里使用 D3 网络可视化库,把小说《危险关系》(Les Liaisons Dangereuses)的通信关系渲染成一张动画社交网络图。该书是 1782 年肖代洛·德·拉克洛创作的"书信体小说"(epistolary novel),故事以一系列信件展开,记录了两位法国贵族主角——瓦尔蒙子爵与梅尔特伊侯爵夫人——充满恶意与道德沦丧的社交算计。通过可视化这些信件,你可以在视觉上直接发现叙事中的核心人物("主要话事人")。

实战:用 Vue.js + D3 把《危险关系》画成社交网络

本课的项目部分配套了完整的 starter(起始模板)与 solution(参考答案)两份工程,位于仓库的3-Data-Visualization/13-meaningful-visualizations/starter/3-Data-Visualization/13-meaningful-visualizations/solution/目录。其技术栈与版本要求(见 solution/package.json)如下:

  • Vue 3(^3.5.19)配合 Vue CLI 5 构建;
  • vue-d3-network(0.1.28):专为 Vue + D3 设计的网络图可视化库;
  • Node.js >= 20.0.0engines字段强制要求);
  • 可用的脚本:npm run serve(开发热重载)、npm run build(生产构建)、npm run lint(代码检查)。

第一步:安装依赖并启动项目

参考 solution/README.md,确保本机装有 NPM 与 Node.js(版本不低于 20.0.0),然后安装依赖并本地运行:

npm install npm run serve

第二步:认识数据——letters.json

打开starter/src/assets/letters.json,里面是小说中全部信件,共 1261 行记录,每条记录包含编号、发信人、收信人、日期与地点等字段,例如:

{ "letter_num": 1, "from": "Cécile de Volanges", "to": "Sophie Carnay", "date": "8/3/17**", "location": "Ursulines" }

fromto正是构建社交网络边的关键数据:一封从 A 写给 B 的信,就是社交网络中的一条从节点 A 指向节点 B 的有向边

第三步:核心逻辑——createLinks()

可视化能否工作,取决于是否把"信件"转换为网络库可消费的links对象。在components/Nodes.vue中找到名为createLinks()的方法,补充如下嵌套循环:

//loop through letters let f = 0; let t = 0; for (var i = 0; i < letters.length; i++) { for (var j = 0; j < characters.length; j++) { if (characters[j] == letters[i].from) { f = j; } if (characters[j] == letters[i].to) { t = j; } } this.links.push({ sid: f, tid: t }); }

这段代码做的事是:遍历每封信,把发信人from与收信人to的名字在预定义的characters角色列表中定位为索引ft,然后向this.links推入{ sid: f, tid: t }——sid是源节点(source id),tid是目标节点(target id)。完成之后刷新页面,就能看到网络图随信件关系生长出来。

第四步:看懂节点与交互的完整实现

solution/src/components/Nodes.vue中提供了可对照的完整实现,值得逐段研读:

  • 模板层<d3-network :net-nodes="nodes" :net-links="links" :options="options" />直接把节点与边数据交给vue-d3-network组件渲染;
  • 数据层nodeslinks初始为空数组;canvas: false表示默认使用 SVG 渲染(可切换为 Canvas);
  • createLinks():如上,负责把信件数据转换成边;
  • getCount(name):统计某角色收到的信件数量,用于决定节点大小——_size: this.getCount(characters[j]) + 20,收到的信越多,节点越大;
  • 节点着色_color: "#" + Math.floor(Math.random() * 16777215).toString(16)为每个节点随机生成十六进制颜色;
  • options 配置force: 3000控制力导向布局的引力强度,size: { w: 600, h: 600 }定义画布尺寸,nodeLabels: truelinkLabels: true显示节点与边的标签;
  • 应用入口src/main.js挂载根组件,src/App.vue只负责引入并渲染Nodes组件。

运行应用后,你可以用鼠标拖拽屏幕上的节点打乱并重新组织布局——这就是力导向网络图最直观的交互魅力。

实践与延伸:从"看懂"到"会批判"

本课最后给出了一个值得长期坚持的练习:到互联网上寻找欺骗性可视化作品,分析作者是如何误导用户的、是有意还是无意,并尝试动手修正这些图表,让它们呈现出"本应如此"的样子。完成本项目后,你还可以对照3-Data-Visualization/13-meaningful-visualizations/assignment.md中的自定义可视化作业,把"选对图表、守住诚实、用对颜色、做好样式"这套方法论应用到自己的数据上——先确保数据被清理和准备妥当,再让可视化成为回答问题的可信工具。

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询