跟着 Microbiome 学画图:堆积柱形图的多层注释
分享是一种情怀
1、历史遗留问题
之前在 知识星球
放了一个带注释的堆积柱形图,趁着昨天的推文,今天把这个也拿出来一起解决了:
今天找了一会终于把这篇文献找到了,名字为 Plant developmental stage drives the diferentiation in ecological role of the maize microbiome :
对应得图为:
注意这个堆积柱形图下面是有多个注释的,分别为 Niche、Stage 还有对应 3 个 Air、Plant 和 Soil 的注释。今天我们探索一下怎么绘制。这篇文章没有提供数据,我们得自己随机生成一些数据来测试。
2、构造数据
# 加载R包
library(reshape2)
library(ggnewscale)
library(ggplot2)
# 构造数据
set.seed(123)
df <- as.data.frame(matrix(data = sample(0:50,105,replace = T),ncol = 5))
# 给列命名
colnames(df) <- c('Heterogeneous selection','Homogeneous selection',
'Dispersal limitation','Homogenizing dispersal',
'Undominated')
# 添加分类
df$type <- rownames(df)
# 查看数据
head(df,3)
Heterogeneous selection Homogeneous selection Dispersal limitation Homogenizing dispersal Undominated
1 30 25 6 30 24
2 14 6 26 15 31
3 50 41 31 29 45
type
1 1
2 2
3 3
然后宽数据转为长数据:
da <- melt(df)
# 查看数据
head(da,3)
type variable value
1 1 Heterogeneous selection 30
2 2 Heterogeneous selection 14
3 3 Heterogeneous selection 50
3、普通堆积图
我们绘制普通版的堆积图看看:
# 普通版
p <- ggplot(data = da) +
# 柱形图层
geom_col(aes(x = type,y = value,fill = variable),
position = position_fill()) +
# 颜色
scale_fill_brewer(palette = 'Set1') +
# Y轴显示为百分比
scale_y_continuous(labels = scales::percent_format()) +
theme_gray(base_size = 18)
p
4、添加第一层注释
基本原理和昨天推文说的差不多,我们看看:
3 个为一组,组内之间没有空格,组内一种颜色,组间有空格,我们按照下面方式计算出相应坐标:
代码实现过程,构造第一层注释数据:
# 第一层注释数据
anno1 <- data.frame(name1 = c('Plastic leaf','Phylloplane','Leaf endosphere',
'Rhizoplane','Root endosphere','Rhizosphere soil',
'Bulk soil'),
xmin = seq(1,19,3) - 0.45,
xmax = seq(3,21,3) + 0.45)
# 因子化
anno1$name1 <- factor(anno1$name1,levels = anno1$name1)
# 查看数据内容
head(anno1,3)
name1 xmin xmax
1 Plastic leaf 0.55 3.45
2 Phylloplane 3.55 6.45
3 Leaf endosphere 6.55 9.45
绘图,添加注释:
# 添加第一层注释
p1 <- ggplot(data = da) +
# 柱形图层
geom_col(aes(x = type,y = value,fill = variable),
position = position_fill(),
# 柱子宽度
width = 0.9) +
# 自定义填充颜色
scale_fill_manual(values = c('#9A1BA0','green','#FFB344','red','#AAAAAA'),
name = 'Ecological process') +
# Y轴百分比格式
scale_y_continuous(labels = scales::percent_format()) +
theme_gray(base_size = 18) +
# 坐标轴标签
xlab('') + ylab('Relative importance') +
# 主题调整
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
# 添加新图例
new_scale('fill') +
# 添加第一层注释
geom_rect(data = anno1,aes(xmin = xmin,xmax = xmax,
ymin = -0.08,ymax = -0.05,
fill = name1)) +
# 自定义颜色
scale_fill_manual(values = c('#FA26A0','#388E3C','#77ACF1',
'#FFC947','#B85C38','#AAAAAA','#364547'),
name = 'Niche')
p1
5、添加第二层注释
可以看到有 8 个组,每个组内又分成了 3 个小组,组内三种颜色,每个组内颜色一样。
这时候计算坐标会稍微麻烦一点,理论上坐标是这样的:
除了每组两 边的坐标 ,还要计算 组内 3 分组矩形的坐标 :
为了方便,我们以 0.5 为间距,计算出每个柱子两边中间的坐标,然后取出位于组最外边两边坐标修正为正确的坐标即可,下面是代码实现过程:
# 第二层注释数据
anno2 <- data.frame(name2 = 1:21,
Stage = rep(c('Seeding stage','Tasseling stage','Mature stage'),7),
xmin = seq(0.5,20.5,1),
xmax = seq(1.5,21.5,1))
# 查看数据
head(anno2,5)
name2 Stage xmin xmax
1 1 Seeding stage 0.5 1.5
2 2 Tasseling stage 1.5 2.5
3 3 Mature stage 2.5 3.5
4 4 Seeding stage 3.5 4.5
5 5 Tasseling stage 4.5 5.5
# 修正组左边位置坐标
anno2[c(seq(1,19,3)),'xmin'] <- anno2$xmin[c(seq(1,19,3))] + 0.05
# 修正组右边位置坐标
anno2[c(seq(3,21,3)),'xmax'] <- anno2$xmax[c(seq(3,21,3))] - 0.05
# 查看数据
head(anno2,5)
name2 Stage xmin xmax
1 1 Seeding stage 0.55 1.50
2 2 Tasseling stage 1.50 2.50
3 3 Mature stage 2.50 3.45
4 4 Seeding stage 3.55 4.50
5 5 Tasseling stage 4.50 5.50
# 因子化
anno2$Stage <- factor(anno2$Stage,levels = unique(anno2$Stage))
可以看到修正后符合我们预想的位置坐标了,接下来就是添加第二层注释:
# 添加第二层注释
p2 <- p1 +
new_scale('fill') +
# 第二层注释
geom_rect(data = anno2,aes(xmin = xmin,xmax = xmax,
ymin = -0.075,ymax = -0.045,
fill = Stage)) +
# 颜色盘的颜色
scale_fill_brewer(palette = 'Set1')
p2
6、添加第三层注释
第三层注释就比较简单了,颜色填充为黑色即可:
# 第三层注释数据
anno3 <- data.frame(series = c('Air','Plant','Soil'),
xmin = c(1 - 0.45,4 - 0.45,16 - 0.45),
xmax = c(3 + 0.45,15 + 0.45,21 + 0.45))
# 因子化
anno3$series <- factor(anno3$series,levels = anno3$series)
# 查看数据
head(anno3,3)
series xmin xmax
1 Air 0.55 3.45
2 Plant 3.55 15.45
3 Soil 15.55 21.45
然后画图:
# 添加第三层注释
p3 <- p2 +
new_scale('fill') +
# 第三层注释
geom_rect(data = anno3,aes(xmin = xmin,xmax = xmax,
ymin = -0.108,ymax = -0.09,
),fill = 'black',
show.legend = F)
p3
最好添加上文字标签就搞定了:
# 添加文字标签
p3 +
geom_text(aes(x = 2,y = -0.15,label = 'Air'),size = 6) +
geom_text(aes(x = 9.5,y = -0.15,label = 'Plant'),size = 6) +
geom_text(aes(x = 18.5,y = -0.15,label = 'Soil'),size = 6)
欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群
哦, 数据和代码已上传至 QQ群,欢迎加入下载。
群二维码:
老俊俊微信:
知识星球:
所以今天你学习了吗?
欢迎小伙伴留言评论!
今天的分享就到这里了,敬请期待下一篇!
最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!
如果觉得对您帮助很大,赏杯快乐水喝喝吧!
往期回顾
◀CIRCexplorer3: 对 circRNA 进行相对定量
◀circRNA-seq:CIRCexplorer2 使用指南(二)
◀circRNA-seq:CIRCexplorer2 使用指南(一)
◀...