最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

R数据分析:冲击流图与热图的做法以及多图布局

来源:博客园

今天看了一篇新冠肺炎相关后遗症的文章,主要探讨新冠住院病人一年后的后遗症情况,文章的统计分析很简单,不过结果展示中的两个图我觉的大家可以学一学,原文如下

Rivera-Izquierdo, M., Láinez-Ramos-Bossini, A.J., de Alba, I.GF. et al. Long COVID 12 months after discharge: persistent symptoms in patients hospitalised due to COVID-19 and patients hospitalised due to other causes—a multicentre cohort study. BMC Med 20, 92 (2022). https://doi.org/10.1186/s12916-022-02292-6

感兴趣的童鞋可以去读一读原文,我们今天依然是聚焦文章呈现形式的复现。


(资料图片仅供参考)

首先就是这个冲击流图

可以看到在这个图中作者将数据以性别进行了分层,每个性别中5个后遗症的发病数量用线条的宽度来表示,这样就可以将每个后遗症中各个性别人数占比情况很直观的展现出来。我们先来看这个图的做法。

实例操练

我现在有数据如下:

比如我现在想做一个和文章中一样的图,我就可以写出代码如下:

ggplot(data = data_plot,       aes(axis1 = x1, axis2 = x2, y = y)) +  geom_alluvium(aes(fill = x1),                curve_type = "cubic") +  geom_stratum() +  geom_text(stat = "stratum",            aes(label = after_stat(stratum))) +  scale_x_discrete(limits = c("x1", "x2"),                   expand = c(0.15, 0.05)) +  theme_void()

运行代码即可出图如下:

可以看到这个图本身是应该带一个图例的,文章中没有带,我们也可以将其拿掉,只需要在theme中设置legend.position="none"或者加上show.legend = F就可以,去掉图例再调整下下区块宽度之后整个图就和文章中的大差不差了。

还有几个关于冲击图的调整方法给大家作一介绍。

线条形状

就是冲击图中的连线的形状是可以有多种选择的,设定的参数是curve_type,可以设定为"linear","cubic","quintic","sine","arctangent", and"sigmoid"."xspline",不同的设定可以体现为不同的线条形状,下图则是不同参数对应的效果:

这些线条形状其实是没有任何意义的,只是外观上的不同,大家应用时只关心它的宽度就好。

Strata(区块)宽度

我们看整个冲击图的时候要明白,其底层是冲击线条,对于我们的图和文章中的图来讲,左右两边的区块叫做Strata,我将其翻译为区块,大家知道我想表达的意思就行。

对于这个区块的宽度我们也是可以进行设定的,比如我们如果区块比较多,冲击图整体比较长的时候我们肯定倾向把区块搞的小一点的。这个时候我们同步调整geom_stratum和geom_alluvium中的width参数即可,比如我都调到0.1效果如下:

可以明显看出来图两边的区块变得就很窄了。

颜色

颜色整体也分为两个部分,一个是冲击图线条的颜色,一个是区块的颜色,可以分开设置,如果要单纯设置线条的颜色直接在geom_alluvium中操作就行,设置区块的颜色在geom_stratum中操作就行,下图就是不同期刊的调色板出来的不同颜色:

只要多试试,肯定可以调到自己满意的颜色的。

冲击图的就给大家写道这儿,接下来看原文中的第二个图,也就是热图的做法

文献原文中作者将每个不同器官不同年龄的后遗症占比数据进行了热图可视化,效果如下:

通过热图作者将数字大小映射到颜色上,可以很方便的进行对比。

这个热图只有一个图例映射,做起来很简单,大家只需要用pheatmap函数喂给原始数据就可以出图,很简单:

我们来看一个更加复杂的热图的做法,来自另外一篇文章,图长这样:

这个热图依然是起到一个描述统计的作用,特点是既有连续变量又有分类变量,所以图例的映射关系就有多个,整体比前面的热图要复杂。前面文章中的热图所有变量都是连续变量,做起来就很容易,数值映射就一个图例就好,在这幅图中可以看到图例很多。

像这样的热图我们可以用多个热图拼接而成,依然是给大家写一个例子:

我们使用的数据是自带的mtcars数据集,长这样:

我期望对里面的每个变量用热图进行统计描述,假定其中有两个变量am和vs都是分类变量。首先我需要将数据切成2份,一份是全含连续变量的子集,另一份是全含分类变量的子集,对两份子集我们分别做热图map1和map2,映射好图例如下,这是所有连续变量的热图:

这是所有分类变量的热图:

做好之后我们用%v%符号将两个图进行合并形成一个合并后的对象,然后将合并后的对象喂给draw函数即可出图,代码如下:

map_list=map1%v%map2draw(map_list,ht_gap = unit(c(0, 0), "mm"),heatmap_legend_side = "bottom"    )

运行上面代码,看效果:

此时整个mtcars数据集的描述统计热图就出来了,和发表的文献中的图进行比对,基本算是原滋原味。

多图布局的操作方法

就是我们经常会遇见的需求就是将几幅图组合在一起形成一张大图,像下面这种文章的样子:

一般人的操作,将R语言中做好的图片导出到本地,然后在PPT中处理布局,再导出PPT,完全也行的。

不过既然都打算使用R了,既然使用R也都关注我了,那么就给大家分享一些更方便实用的多图布局的操作,比如我现在在R中已经画好了4副图,假设为p1,p2,p3,p4,我现在像2*2进行布局,只需要写出如下代码:

plot_grid(p1, p2, p3, p4)

运行后,4张图就布局为我们想要的样子了:

写论文的时候通常会需要对子图打上标签比如abcd,方便写图的注释,此时我们只需要设定labels参数就可以,比如我写出代码如下:

plot_grid(p1, p2, p3, p4,labels = "AUTO")plot_grid(p1, p2, p3, p4,labels = c("A", "B", "C", "D"))

出来的效果都是一样的,子图都带上标签:

还有包括编号的顺序,子图的宽度,子图的高度,标签的位置等等都是可以设置的,详见参数说明:

另外ggpubr包中的ggarrange也可以很方便的帮助我们进行多图布局,使用方法也是差不多的。

小结

今天给大家介绍了冲击流图和热图的做法,顺便写了cowplot包进行多图布局,希望对大家有帮助。感谢大家耐心看完,自己的文章都写的很细,重要代码都在原文中,希望大家都可以自己做一做,请转发本文到朋友圈后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先记得收藏,再点赞分享。

关键词: 多图布局 连续变量 描述统计