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%map2
draw(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包进行多图布局,希望对大家有帮助。感谢大家耐心看完,自己的文章都写的很细,重要代码都在原文中,希望大家都可以自己做一做,请转发本文到朋友圈后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先记得收藏,再点赞分享。
R数据分析:冲击流图与热图的做法以及多图布局的更多相关文章
- 用R包中heatmap画热图
一:导入R包及需要画热图的数据 library(pheatmap) data<- read.table("F:/R练习/R测试数据/heatmapdata.txt",head ...
- R数据分析:潜类别轨迹模型LCTM的做法,实例解析
最近看了好多潜类别轨迹latent class trajectory models的文章,发现这个方法和我之前常用的横断面数据的潜类别和潜剖面分析完全不是一个东西,做纵向轨迹的正宗流派还是这个方法,当 ...
- R数据分析:二分类因变量的混合效应,多水平logistics模型介绍
今天给大家写广义混合效应模型Generalised Linear Random Intercept Model的第一部分 ,混合效应logistics回归模型,这个和线性混合效应模型一样也有好几个叫法 ...
- R语言学习 - 热图简化
绘制热图除了使用ggplot2,还可以有其它的包或函数,比如pheatmap::pheatmap (pheatmap包中的pheatmap函数).gplots::heatmap.2等. 相比于gg ...
- R语言学习 - 热图绘制heatmap
生成测试数据 绘图首先需要数据.通过生成一堆的向量,转换为矩阵,得到想要的数据. data <- c(1:6, 6:1, 6:1, 1:6, (6:1)/10, (1:6)/10, (1:6)/ ...
- R绘图(2): 离散/分类变量如何画热图/方块图
相信很多人都看到过上面这种方块图,有点像"华夫饼图"的升级版,也有点像"热图"的离散版.我在一些临床多组学的文章里面看到过好几次这种图,用它来展示病人的临床信息 ...
- R语言学习 - 热图美化
实际应用中,异常值的出现会毁掉一张热图.这通常不是我们想要的.为了更好的可视化效果,需要对数据做些预处理,主要有对数转换,Z-score转换,抹去异常值,非线性颜色等方式. 对数转换 为了方便描述,假 ...
- [R] 如何绘制各样本的pathway丰度热图?
前言 一般而言,我们做完pathway富集分析,就做下气泡图或bar图来进行展示,但它们实际上只考虑了富集因子和Pvalue.如果我们不关注这两个因素,而是在乎样本本身的pathway丰度呢? 对于K ...
- R语言与医学统计图形-【17】ggplot2几何对象之热图
ggplot2绘图系统--heatmap.geom_rect 这里不介绍更常见的pheatmap包. 1.heatmap函数 基础包. data=as.matrix(mtcars) #接受矩阵 hea ...
- 精心整理(含图版)|你要的全拿走!(R数据分析,可视化,生信实战)
本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/ZEjaxDifNATeV8fO4krOIQ更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. 为 ...
随机推荐
- 解密prompt系列39. RAG之借助LLM优化精排环节
RAG的部分我们之前讨论过信息召回的多样性,信息密度和质量,主要集中在召回,融合,粗排的部分.这一章我们集中看下精排的部分.粗排和精排的主要差异其实在于效率和效果的balance.粗排模型复杂度更低, ...
- 基于Python后端构建多种不同的系统终端界面研究
在我们一般开发系统的时候,往往会根据实际需要做出各种不同的系统终端界面,如基于BS的,CS.APP.小程序等等,一般都是基于一个统一接入的Web API后端,本篇系统探寻对基于Python后端构建多种 ...
- query和params的区别
2者都是编程式路由跳转用来存放传递数据的位置,query使用path引入,数据显示在地址栏上,params使用name引入,传递的数据在页面看不见 :
- 0606-nn.functional
0606-nn.functional 目录 一.nn.functional 和 nn.Module 的区别 二.nn.functional 和 nn.Module 结合使用 pytorch完整教程目录 ...
- python之图片与视频互转
图片转视频 def image_to_video(image_dir, video_dir, fps): im_list = [i for i in os.listdir(image_dir) if ...
- JavaScript 语句后可以省略分号么?
摘自知乎:https://www.zhihu.com/question/20298345 田乐:加与不加是风格问题,风格争议不需要有个定论.关键的问题在于如何"争论",处理好冲突, ...
- Java新特性--方法引用
常见方法引用 方法引用可以让你重复使用现有的方法定义,并像Lambda一样传递它们. 方法引用可以看做是仅仅调用特定方法的Lambda表达式的一种便捷写法.类似于Lambda表达式,方法引用不能独立存 ...
- 从 Git 提交历史生成 Release Note
发布软件时写 Release Note 算是常规操作,但每次从头手打也有点累,可以考虑从 Git 的提交历史中自动生成. Git 提交信息一般是三段式结构,段落之间使用空行隔开: <subjec ...
- Mysql(2)—SQL语法详解(通俗易懂)
一.关于SQL 1.1 简介 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言.它主要用于数据的查询.插入.更新和删除等操作.SQL ...
- DRF-Serializers序列化器组件源码分析及改编
1. 源码分析 注意:以下代码片段为方便理解已进行简化,只保留了与序列化功能相关的代码 序列化的源码中涉及到了元类的概念,我在这里简单说明一下:元类(metaclass)是一个高级概念,用于定义类的创 ...