
● 本研究提供了一个用户友好的基于代码的界面tidyplots,用于创建可定制且富有洞察力的图表。凭借其一致且直观的语法,tidyplots 使研究人员能利用自动化的数据可视化流程,同时最大限度地减少所需的编程技能。
德国汉堡-埃彭多夫大学医学中心,汉堡分子神经生物学中心,神经免疫学与多发性硬化研究所
基于代码的数据可视化是理解和交流实验发现的关键工具,同时也确保了可扩展性和可重复性。然而,复杂的编程接口对生命科学家造成了重大障碍。为了应对这一挑战,tidyplots 提供了一个用户友好的基于代码的界面,用于创建可定制且富有洞察力的图表。凭借其一致且直观的语法,tidyplots 使研究人员能利用自动化的数据可视化流程,同时最大限度地减少所需的编程技能。
数据可视化是数据分析工作流程中的关键组成部分,它促进了高效的数据探索和实验发现的提取,包括它们的方向、规模和稳健性。此外,它是在科学出版物中交流发现和让社区参与讨论以验证、证实或挑战结果的关键工具。
生命科学方法的进步导致了实验数据量和复杂性的激增。因此,传统的数据分析工作流程——通常依赖于复制粘贴和手动电子表格操作——难以满足更高通量和日渐增长的复现性和透明度标准的需求。这促使生命科学社区采用程序化的数据分析ECO。最广泛使用的工具包括基于R的包,如tidyverse和ggplot2,以及基于Python的库,如Pandas、NumPy、Matplotlib和Seaborn。
然而,尽管这些工具实用且强大,但每个工具都使用专门的语法,并且需要显著的编码经验,这对生命科学家的使用构成了障碍。像带有误差棒和统计测试的散点图这样简单的东西,常常要大量的代码和对绘图工具内部工作的复杂知识。为了应对这一挑战,本文介绍了开源R包“tidyplots”,它专门设计来使生命科学家能够从自动化的数据可视化流程中受益。
tidyplots基于ggplot2构建,旨在满足与ggstatsplot和ggpubr相似的需求;然而,与ggplot2语法扩展不同,tidyplots引入了一种基于一致且直观语法的新接口,极大减少了对编程经验的依赖。
tidyplots的工作流程由一系列函数调用组成,这些调用在一个流程中相互连接(图1A)。使用tidyplot()函数启动图表后,有三个主要动词用于构建和修改图表,即添加(add)、移除(remove)和调整(adjust)。用户还可以再一次进行选择不同的主题、将图表分割成多图布局或将其保存到文件中(图1A)。例如,我们将使用tidyplots包中的研究数据集,该数据集包括两个不同治疗剂量的治疗组和安慰剂组,以及衡量治疗成功的评分(图1B)。在tidyplot()函数中,我们定义了用于x轴、y轴和颜色的变量。在下一行,个人会使用add_mean_bar()函数添加每个组的平均值,表示为条形图。这展示了一个通用模式,其中函数名称以动作动词开头,如add,后跟统计实体,如mean,再后跟实体的图形表示,如bar。同样地,我们大家可以使用add_sem_errorbar()添加平均值的标准误差作为误差棒,使用add_data_points()添加原始数据值作为点,使用add_test_pvalue()添加统计检验的p值(图1B)。tidyplots提供了超过50个添加函数,涵盖了原始数据值、汇总统计、离散度、分布、比例、注释和统计比较的绘图(图1C,D)。
(A) tidyplots工作流程概览。(B) 从数据集到图表的方案和示例代码。(C) 添加函数的语法,展示统计实体与图形表示的可选组合。(D) 预定义图表组件的添加函数语法。(E) 调整图表的函数语法。
幸运的是,用户无需记忆所有可用的函数名称,因为当前代码编辑器中的自动补全功能在输入几个字符后即可推荐合适的函数。因此,输入add_会列出所有添加函数,输入add_mean会列出所有可用的平均值图形表示,而输入add_bar则会列出所有可以表示为条形图的统计实体。
接下来,用户可以移除不需要的图表元素,并调整图表的外观,包括颜色、字体、图例、标题、大小、间距和坐标轴(图1E)。有一组专门的函数处理从数据集本身派生的颜色和轴标签。从rename、reorder、sort和reverse开始,这些函数允许方便地修改沿轴和颜色图例的数据标签的顺序和命名(图1E)。
鉴于其模块化架构,tidyplots可用于创建广泛的科学图表(图2A),而其对人类代码可读性的关注使得底层源代码易于读写。为了说明这一点,我们将tidyplots与最流行的R绘图包ggplot2进行比较。由于其更细粒度的接口,ggplot2代码较难接近,并且需要对几个内部ggplot2概念的深入理解(图2B)。相比之下,tidyplots需要显著更少的词汇、字符、函数调用和函数参数来实现与图2A相当的图表,从而证实了其代码复杂性的显著降低(图2C)。
(A) 图表展示。(B) 生成等效图表的ggplot2和tidyplots示例代码。(C) 对(A)中图表的ggplot2和tidyplots代码进行比较。评估的指标包括代码行数、词汇数、字符数、函数调用次数和参数数量,分别对比ggplot2代码与tidyplots代码。统计分析采用Mann–Whitney U检验进行。
通过采纳ggplot2逐步添加信息层的概念,tidyplots保持了高度的灵活性,使得能够创建满足不同数据可视化需求和用例的定制图表。这些图表包括生物统计学和生物信息学中的常见图表类型(图3A-E),同时也适用于社会科学、自然科学和数据新闻学。一个持续演化的此类应用集合,连同所需的数据和代码,可以在找到。
(A)基因表达热图。(B) 火山图。(C) 微生物组组成。(D) 基因相关性热图。(E) RNA-seq质量控制。(A)、(B)和(E)中的数据改编自Schattling等人的研究。(C)中的数据改编自Tamburini等人的研究。(D)中的数据改编自Spellman等人的研究。
由于tidyplots基于ggplot2构建,它允许无缝集成ggplot2代码。因此,tidyplots提供了对ggplot2或ggplot2扩展包中实现的广泛功能的访问。为了简化这种集成,tidyplots提供了add()辅助函数,使得可以在不中断tidyplots流程的情况下添加ggplot2代码。然而,tidyplots和ggplot2之间也存在显著的设计差异。一个关键区别是tidyplots一致使用绝对尺寸。默认情况下,新创建的tidyplot的绘图区域大小为50×50毫米。这些尺寸能够正常的使用adjust_size()函数轻松调整。这种方法确保了绘图区域大小、字体大小、绘图元素和线条强度的比例保持一致。因此,tidyplot保持其大小和组成,不受图形设备或显示窗口大小的影响。为了将tidyplots保存到文件中,save_plot()函数会自动提取图表的绝对尺寸,以确定用于写入输出文件的图形设备的适当大小。
总体而言,tidyplots为创建基于代码的科学图表提供了一个强大且用户友好的解决方案。除了其核心功能外,tidyplots还提供了几项有价值的特性,包括适合学习和教学的演示数据集、为色觉缺陷者优化的配色方案,以及包含初学者友好的入门指南的详尽文档。tidyplots还通过创建简化复杂可视化的过程,提高了经验比较丰富用户的生产力,使他们可以更多地关注数据解释和分析。通过促进生命科学中基于代码的绘图使用,tidyplots有潜力加速科学发现,并增强研究的可重复性和透明度。
tidyplots的界面深受tidyverse生态系统及其基础设计原则的启发。最重要的是,tidyplots旨在(i)利用自然语言元素最大化人类代码的可读性,(ii)在函数间保持一致并减少记忆特殊情况的必要性,以及(iii)模块化,即复杂任务能分解为多个步骤。函数名称以动作动词开头,如add、remove、adjust或save,清楚地表明函数执行的操作类型。对于添加汇总统计,统计实体优先于图形表示,鼓励在决定如何表示(如条形图)之前有意识地决定要绘制什么(如平均值)。
类似于作为tidyplots基础的绘图框架ggplot2,图表通过逐步添加信息层来构建。这种模块化设计提供了最大的灵活性和自由度,以组合元素来构成复杂图表。然而,ggplot2和tidyplots之间的一个主要区别是,ggplot2函数以使用+运算符添加的名词为特征,而tidyplots函数以使用管道运算符在管道中组合的动词为特征。管道概念在R编程中已被广泛采用,因为它极大地增强了代码的可读性。利用管道,tidyplots旨在提高数据分析工作流程的一致性。因此,数据集的整理、绘图以及图表的后处理(如多图排列和保存)可以方便地结合在一个管道中,无需切换运算符。
tidyplots的另一个设计决策是第一先考虑专用函数而非函数参数。例如,能够最终靠一个名为add_mean()的函数来实现多种图形表示的平均值添加,该函数将所需的图形表示(如条形图、短划线或点)作为参数。相反,tidyplots实现了三个单独的函数,分别称为add_mean_bar()、add_mean_dash()和add_mean_point()。因此,tidyplots鼓励使用代码编辑器中的自动补全功能,在输入时提供所有可用选项的列表,从而消除了查阅函数文档的需要。实际上,大多数tidyplot函数无需任何参数即可按预期工作,极大地加快了代码编写速度,提高了代码可读性,并促进了tidyplots的学习。遵循这一理念,tidyplots提供了超过50个遵循相同一致命名方案的添加函数。
上述第一先考虑专用函数而非函数参数的做法在包开发中带来了一个核心挑战,即代码重复。例如,add_mean_bar()、add_median_bar()和add_sum_bar()提供的功能非常相似,仅在于它们应用的统计汇总函数不同。在定义这些函数时,这会导致相当大的代码重复,这不仅增加了源代码的数量,更重要的是,损害了代码的可维护性。为了应对这一挑战,tidyplots大量使用了函数工厂。函数工厂是返回制造函数的函数。例如,tidyplots的函数工厂ff_bar()接受一个统计汇总函数(如mean、median或sum)作为输入,并输出制造的函数add_mean_bar()、add_median_bar()和add_sum_bar()。这种方法消除了代码重复,极大地增强了代码的可维护性。
tidyplots在很大程度上依赖于tidyverse包生态系统,特别是ggplot2。然而,为了提供特定功能,tidyplots还依赖于一些其他优秀的开源R包。这些包括patchwork以实现绝对绘图尺寸,ggrastr以实现具有太多矢量形状的层的栅格化,ggbeeswarm以避免通过数据点的小提琴形分布过度绘图,ggrepel以处理重叠的文本标签,以及ggpubr用于直接将统计比较添加到图表中。
为了基准测试代码复杂性,使用tidyverse包stringr分析了生成tidyplots图表画廊(图2A)的代码,并与生成等效图表所需的ggplot2代码进行了比较。基准测试指标包括ggplot2代码与tidyplots代码中的行数、单词数、字符数、函数调用次数和函数参数数量。分析的源代码以及生成的图表可在获取。基准测试指标的统计分析使用Mann–Whitney U检验进行。
神经免疫学与多发性硬化研究所(INIMS)高级科学家及软件开发员Jan Broder Engler为本文第一作者兼通讯作者。
Jan Broder Engler是神经免疫学与多发性硬化研究所(INIMS)高级科学家,软件开发员。研究方向大多分布在在免疫反应调控机制、免疫耐受恢复机制以及神经保护治疗策略的开发,2018年因在妊娠诱导的免疫耐受机制方面的研究荣获马提尼博士奖。