查看: 4289|回复: 38

[R语言] 如何绘制Science文章的“花式”河流图?

  [复制链接]

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
461
注册时间
2020.6.16
在线时间
304 小时

发表于 2021.11.1 10:28:49 | 显示全部楼层 |阅读模式
堆叠图简直是万能大法有没有!

在各类微生物群落及目前大热的单细胞组学研究的文章中,堆叠图可以说是不可或缺的。

我们先一起欣赏下高分文章中的那些好看的柱状堆叠图

Fig1(Nat Biotechnol,2021)

Fig2(Nature Cancer,2021)

这一类图表将不同分组/样本中所有分类数据进行堆叠,并以百分比堆叠柱状图或者常规堆叠柱状图的形式进行展现,从而直观看出各个分类数据在不同组别下的占比情况。

如在微生物群落研究中,可用于展示不同样本的群落物种组成信息;而在单细胞研究中,可用于展示不同样本中各类亚群细胞数量信息或是各类亚群细胞中的来自不同样本的细胞数量等等。

还有一类堆叠面积图,主要在样本之间的处理方式存在梯度变化关系时(处理不同的时间、某处理后的一段时间、不同浓度梯度处理……)使用,这类图表更关注各个分类变量随着梯度处理产生的波动和变化趋势。由于可以画出好看的“流线”,又被称为河流图。如下,Fig3主要展示了各菌门OTUs的累积丰度随季节的变化。

Fig3(Science,2017)

Fig4(Nat Cancer,2021)

那么怎么看堆叠面积图呢?图表每个变量对应一种颜色,每个颜色围成的面积直观反应数据的大小,且每一个变量的数值都在前一个变量的基础上进行叠加,图形的总面积即为所有变量数据的总和(和堆叠柱状图类似)。


小编纵观一番,发现Excel就能画出面积堆叠图,但是只能画出“折线状”,并不能呈现出好看的“河流”。

想画出好看的河流图还是需要用到R,比如streamgraph包以及ggplot2的扩展包ggstream。ggplot2灵活性更强,因此今天主要用ggstream来画河流图,也给大家简单过一下用streamgraph包和Excel如何绘制。

1. ggstream绘制河流图大法

[AppleScript] 纯文本查看 复制代码
#安装ggstream拓展包和配色包RColorBrewer
install.packages('ggstream')
install.packages('RColorBrewer')

#载入ggstream包:
library(ggstream)
library(ggplot2)
library(RColorBrewer)

#设置工作目录:
setwd("C:/Users/RenYing/Desktop/面积堆叠图")

#读入本地数据:
data<-read.table("OTUs,ggstream.txt",header=T)


使用的数据格式整理如下:


[AppleScript] 纯文本查看 复制代码
#指定绘图顺序:
data$phylum <- factor(data$phylum,levels = unique(data$phylum))

#将数据与图形建立映射,得到p
p<-ggplot(data,aes(time,OTUs,
fill=phylum,
color=phylum,
label=phylum))
p



[AppleScript] 纯文本查看 复制代码
#加入geom_stream()函数绘制基础河流图,得到p1
#但因数据的最大最小值相差过大,此时ggstream默认参数的出图效果非常奇怪:
p1<-p+geom_stream()
p1



[AppleScript] 纯文本查看 复制代码
#接下来进行重要参数调整,下面两个参数会直接影响河流图的最终效果:
#extra_span:调整河流整体宽度,适合数据最大最小值相差巨大时进行调整;
#bw:核密度估计的宽带,即河流的“波峰”,数值越高越平缓;
p2<-p+geom_stream(extra_span=1.1,bw=0.75)
p2



[AppleScript] 纯文本查看 复制代码
#根据需求选择河流图类型(官方提供三种样式:mirror、ridge、proportional,默认为mirror)

#mirror:纵轴呈“镜像”,河流图双向波动(不做更改默认为此选项):
p2

#ridge:纵轴起点从0开始,河流图单向波动:
p3<-p+geom_stream(extra_span=1.1,bw=0.75, type = c("ridge"))
p3



[AppleScript] 纯文本查看 复制代码
#proportional:百分比型面积堆叠河流图:
p4<-p+geom_stream(extra_span=1.1,bw=0.75, type = c("proportional"))
p4



[AppleScript] 纯文本查看 复制代码
#替换原始配色(使用RColorBrewer包):
display.brewer.all()#查看此包的全部配色方案



[AppleScript] 纯文本查看 复制代码
mycolor<-brewer.pal(9, "Set3")#选择Set3主题色板
p5<-p2+scale_fill_manual(values=rev(mycolor))+
scale_color_manual(values=rev(mycolor))
p5



[AppleScript] 纯文本查看 复制代码
#再换一种配色:
mycolor2<-brewer.pal(9, "Spectral")#选择Spectral主题色板
p6<-p2+scale_fill_manual(values=rev(mycolor2))+
scale_color_manual(values=rev(mycolor2))
p6



[AppleScript] 纯文本查看 复制代码
#再换成“ridge”型河流图:
p6<-p3+scale_fill_manual(values=rev(mycolor2))+
scale_color_manual(values=rev(mycolor2))
p6



[AppleScript] 纯文本查看 复制代码
#自定义主题:
top.mar=0.2
right.mar=0.2
bottom.mar=0.2
left.mar=0.2

mytheme<-theme_classic()+
theme(text=element_text(family = "sans",color ="gray30",size = 12),
axis.line = element_line(size = 0.6,color = "gray30"),
axis.ticks = element_line(size = 0.6,color = "gray30"),
axis.ticks.length = unit(1.5,units = "mm"),
plot.margin=unit(x=c(top.mar,right.mar,bottom.mar,left.mar),units="inches"))
p7<-p6+mytheme
p7

[AppleScript] 纯文本查看 复制代码
#将绘图区域对齐到坐标原点,限制x轴范围避免标签溢出:
p8<-p7+scale_x_continuous(expand=c(0,0),limits=c(5,9))
+scale_y_continuous(expand=c(0,0))
p8



[AppleScript] 纯文本查看 复制代码
#“mirror”型河流图推荐的主题:
p5+theme_minimal()+theme(panel.grid.minor=element_blank())



[AppleScript] 纯文本查看 复制代码
#百分比型面积堆叠河流图推荐的主题:
p9<-p4+scale_fill_manual(values=rev(mycolor2))+
scale_color_manual(values=rev(mycolor2))
p9+theme_bw()+theme(panel.grid=element_blank())+
scale_x_continuous(expand=c(0,0),limits=c(5,9))+
scale_y_continuous(expand=c(0,0))



Over!

2. streamgraph绘制河流图

篇幅受限,我们简单过一下,大家有兴趣自己再去琢磨琢磨。

[AppleScript] 纯文本查看 复制代码
#包的安装和载入+创建数据集:
install.packages('devtools')
devtools::install_github("hrbrmstr/streamgraph")
library(streamgraph)
data<-data.frame(
time=rep(seq(2001,2021),each=10),
name=rep(letters[1:10],21),
value=sample(seq(0,1,0.001),210))

# 直接绘图,默认出图为与ggstream相同的“波浪状”,但这个包还可以调整为“折线状”或“者阶梯状”;
p1<-streamgraph(data,key="name",value="value",date="time")
p1



[AppleScript] 纯文本查看 复制代码
#通过interpolate="linear"参数设置为折线状:
p2<-streamgraph(data,key="name",value="value",date="time",interpolate="linear")
p2



[AppleScript] 纯文本查看 复制代码
#通过interpolate="step"参数设置为阶梯状:
p3<-streamgraph(data,key="name",value="value",date="time",interpolate="step")
p3



[AppleScript] 纯文本查看 复制代码
#与ggstream相同,还可以调整为单向波动的堆叠面积图和百分比型堆叠面积图:
#默认参数为offset="silhouette";
#单向波动的面积堆叠图:
p4<-streamgraph(data, key="name",value="value",date="time",interpolate="linear",
offset="zero")
p4



[AppleScript] 纯文本查看 复制代码
#百分比型面积堆叠图:
p5<-streamgraph(data,key="name",value="value",date="time",interpolate="step",offset="expand")
p5



Over!

3. Excel绘制面积堆叠图

首先整理好自己的数据:


选中作图数据,工具栏选择插入—图表—面积图—堆积面积图/百分比堆积面积图即可。


插入后如下。根据需求调整颜色、字体、坐标轴、标签等参数,这里就不在赘述啦,相信Excel大家用的都棒棒滴~最后,使用XL Toolbox NG插件将图片输出为可自定义分辨率和图片格式类型的符合期刊投稿需求的高清图片即可(插件用法见推文:《如何一步到位,将Excel图表输出成符合期刊需求的高分辨率图片?》)。


号外号外!

科研人的双十一狂欢火热持续中,详情可戳→属于科研人的双十一狂欢~还有宠粉抽奖等你参加!


好啦,今天的分享就到这里。你更喜欢哪种河流图呢?

本文作者:基迪奥-喵酱

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2020.2.12
在线时间
81 小时

发表于 2021.11.1 14:47:19 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2021.2.25
在线时间
2 小时

发表于 2021.11.1 17:06:31 | 显示全部楼层
加油加油
加油哦
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
1
注册时间
2016.8.25
在线时间
92 小时

发表于 2021.11.1 17:19:15 | 显示全部楼层
excel简直无所不能啊
新的一天加油!
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
0
注册时间
2020.11.21
在线时间
76 小时

发表于 2021.11.1 19:17:39 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
0
注册时间
2020.11.21
在线时间
76 小时

发表于 2021.11.2 19:20:53 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
0
注册时间
2020.11.21
在线时间
76 小时

发表于 2021.11.3 21:16:26 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
79 小时

发表于 2021.11.3 21:30:54 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
79 小时

发表于 2021.11.6 22:09:02 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2021.1.28
在线时间
13 小时

发表于 2021.11.8 11:45:27 | 显示全部楼层
顶!!!!!!!!!!!!
回复

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
39
注册时间
2016.5.12
在线时间
134 小时

活跃会员


发表于 2021.11.9 15:55:32 | 显示全部楼层
这么好的东西,收藏了。
新的一天加油!
回复 支持 反对

使用道具 举报

中华鲟

Rank: 5Rank: 5

主题
0
注册时间
2020.2.12
在线时间
81 小时

发表于 2021.11.11 08:51:38 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2021.1.28
在线时间
13 小时

发表于 2021.11.12 11:20:08 | 显示全部楼层
顶!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2021.1.28
在线时间
13 小时

发表于 2021.11.14 14:43:25 | 显示全部楼层
顶!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2021.6.22
在线时间
16 小时

发表于 2021.11.14 15:11:52 | 显示全部楼层
学习
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
31
注册时间
2016.1.8
在线时间
556 小时

发表于 2021.11.15 11:12:01 | 显示全部楼层
好贴当怒赞
新的一天加油!
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2019.5.11
在线时间
2 小时

发表于 2021.11.17 17:06:50 | 显示全部楼层
棒呆
好看新 好第几考场
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
79 小时

发表于 2021.11.18 08:11:48 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

版主

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2016.3.23
在线时间
243 小时

突出贡献优秀版主


发表于 2021.11.18 16:46:23 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

功夫熊猫

Rank: 10Rank: 10Rank: 10

主题
3
注册时间
2017.9.8
在线时间
79 小时

发表于 2021.11.19 08:31:16 | 显示全部楼层
新的一天加油!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表