中了数据可视化的毒:BBC如何使用R语言绘制数据图表?
过去一年里,BBC 视觉与数据新闻(Visual and Data Journalism)团队的数据记者已经从根本上改变了他们绘制发表在 BBC 新闻网站上的数据图表的方式。我们将在这篇文章中介绍我们如何以及为何要使用 R 语言的 ggplot2 软件包来创建可直接使用的图表,我们也会给出我们的流程和代码以及分享我们一路上所学到的东西。
BBC 视觉与数据新闻团队的数据记者已经使用 R 来执行复杂和可重复的数据分析以及构建原型一些时日了。
比如,在获过奖的 NHS 跟踪项目中,我们使用了 R 来提取、清洗、清理和探索数百份电子表格中的数据,以了解 NHS 目标是否遭受了攻击。当我们在 2017 年分析英格兰和威尔士超过 800 万住宅物业交易以便了解扣除了物价因素的房价变化情况时,R 也是我们的首要选择;该项目去年获得了皇家统计学会的一个奖项。
但当涉及到绘制图表时,情况又不一样。
我们曾使用了 R(尤其是 R 的数据可视化软件包 ggplot2)来进行数据探索,从而让模式可视化以及帮助我们理解数据和寻找故事。但我们没有按照 BBC 新闻的图表风格来构建可用于网上发布的图表。
为了创建在 BBC 新闻网站上伴随故事的图表,我们有两个主要选项:如果时间充足,我们可以委托我们的设计团队绘制图表。如果我们需要快速周转,我们会转而选择我们的内部制图工具。
在 2018 年的前几个月,数据团队中一些充满好奇心的成员开始了实验,深入到了 ggplot2 软件包内部,想要搞清楚我们还需要多少工作才能复现 BBC 的内部风格。
在去年三月份,我们发布了第一张从头至尾都使用 ggplot2 绘制的图表。
自那以后,进展很快。
比起制图工具,ggplot2 能提供更多控制和创造性,能让人不局限于数量有限的图表。使用脚本能节省大量时间和精力,尤其是在操作需要定期更新的数据时——可重复性是我们的工作流程的一大关键需求。
简而言之,这带来了彻底的变革,所以我们很快就将注意力转向了如何最好地管理这种新发现的能力。
我们需要找到一种收集和共享我们积累的知识的好方法,并且让我们整个团队都能使用;我们还要开发出一个简单且易于重复的工作流程,让团队在从头至尾绘制图表时有一致性的体验。
在使用 R 制图时,我们采用了一种双管齐下的方法:将这些难题的解决方案放入了一个我们称之为 bbplot 的软件包以及我们团队的 R「食谱」——一份 ggplot 参考手册。现在我们将它们都开源了。
- bbplot:https://github.com/bbc/bbplot
- R cookbook:https://bbc.github.io/rcookbook/
bbplot 软件包有什么用?
这个软件包的开发目的是处理所有反复出现的障碍,简化在所有图表中添加对象的工作流程。
当我们刚开始使用 R 时,每次绘制图表时都必须调整每个单独的元素以将默认的 ggplot 风格改成我们内部的 BBC 风格。
将其保存为一个函数很明显是简化我们生活的第一要务。
我们还有很多类似的难题需要搞清楚:如何添加 BBC 标识,并且无论你想要导出的图表的纵横比如何,都能有合适的尺寸?如何将图表标题对齐到左上角?就是这类问题。
通过与视觉与数据新闻团队的设计师紧密合作,我们逐一解决了这一问题,将解决方案放入了易于重复使用的函数中。
下一步是将这些解决方案集中于一处,以提供一致的体验以及让所有一切都能尽可能简单地复用——这就是 bbplot。
之前我们讨论了需要加入到该软件包中的功能。我们是否应该创建制作特定图表类型的函数?预选择条形图的颜色以匹配我们的设计调色板好不好?
我们抵住了过于规范的诱惑,提出了适用于创建图表时可能出现的每个潜在问题的普适性解决方案。
对于这个软件包,我们的目标是仅包含绘制每张图表时所必需的函数,以简化工作流程,也不失灵活性——因为灵活性是使用 ggplot2 的一大实在优势。
我们想的是,我们为 ggplot2 默认外观到我们内部风格的改变而创建的函数 bbc_style() 能够完成 90% 的工作,之后你可以对你的图表进行任何额外的调整,这和其它制图工具不一样——只会给你提供完成的图表,调整空间很小。
为什么要做一个「食谱」?
这个「食谱」是基于我们团队对 ggplot2 的集体知识综合而成的一份指南。这是一份参考手册,而不是教程,其中可能不会告诉你如何用 R 绘制你的第一张图表,但却包含了很多有用的小技巧。
我们的想法是,每当数据团队的成员解决一个特定问题时(比如在图中加入一条曲线箭头或突出显示条形图的一条),都能将代码加入到这个「食谱」中,从而节省你和同事下一次的时间。
在创建图表时,团队成员可以求助这个「食谱」,寻找答案和解决方案——比如如何绘制特定类型的图表(如 dumbbell chart)或如何在你的图中加入文本注释。另一方面,这个软件包可以自动处理你绘制每张图表时都需要的解决方案——比如添加 BBC 标识。
我们希望简化这些事情,但保留脚本带来的自由和控制能力也很重要。
我们学到了什么?
用这种方式处理图表有很多好处。
我们的重点是创建一个可重复的工作流程,这意味着我们无需在另一个程序中进行最后的润色,就能完全使用 R 创建出尽可能多的图表,而且将我们的知识集中到一起能让这些知识轻松地传递给不太习惯使用 R 的团队成员。
R 能够满足我们所有的制图需求吗?不是的。我们没将其用于交互式图表,因为 JavaScript 库 D3 更合适,而且有时候单独使用 Illustrator 等软件来调整注释比直接使用 R 的工作量少得多。但对于静态图表,我们发现 R 和 ggplot2 非常有用。
也许最重要的应该是团队合作:通过将我们的努力汇集一处和分享我们的技能,我们的知识获得了极大的增长。因为推进我们对 R 的使用并不是某一个人独自的责任,而是数据团队很多人共同实验,一起推行的。正因如此,我们收集的知识才得以快速增长。
教会其他人——意料之外的结果
使用 ggplot2 创建生产可用的图表的另一个关键优势原本并不在我们的必需计划中。
团队其他部分的同事的积极反馈让我们开发了一个为期六周的内部课程,以让人们尽快了解使用 R 的基本知识以及上手使用 bbplot 和「食谱」来绘制图表。
这个课程并不能在六次短课中教会人们有关 R 的一切,但能帮助完全不了解 R 的人熟悉这是什么。我们每周都会介绍一个新概念,与他们谈论它并为他们指出他们可以在对应的课程周学习的网络教程。我们为课程参与者创建了一个 Slack 频道,他们可以在这里互相讨论或寻求帮助。
在这六周之中,参与者会学习如何将数据载入 R、不同的数据类型、使用 tidyverse 软件包在 R 中进行一些非常基本的数据操作和分析、对 ggplot2 的介绍。在课程结束时,他们会面临一个挑战:用他们学习到的所有不同的技能、概念和代码,基于原始数据生成基本图表。
课程的最后是一场三小时长的研讨会,主题是 bbplot 软件包的工作方式以及如何有效使用我们的 R「食谱」。我们发现,为人们提供「食谱」以及他们应该在六周的时间里生成的图表,并不能人更轻松地学习 R——但心中有目标,知道这能在日常工作中提供助益,能让人更有动力去学习。
为我们的同事提供课程的一大主要成功在于激励了某些参与者继续使用 R 以及提升他们的 ggplot2 知识。
现在,他们很多人已经对某些事情的工作方式和原因有了更好的理解,而不只是复制我们为他们准备的代码。他们现在已能生成不属于「食谱」配方的图表,实际操作时所需的数据团队的帮助也越来越少。
接下来呢?让团队中的每个人为这份「食谱」添加配方并将其提交到 GitHub。