查看原文
其他

跟着 Microbiome 学画图:堆积柱形图的多层注释

JunJunLab 老俊俊的生信笔记 2022-08-15


分享是一种情怀

1、历史遗留问题

之前在 知识星球 放了一个带注释的堆积柱形图,趁着昨天的推文,今天把这个也拿出来一起解决了:

今天找了一会终于把这篇文献找到了,名字为 Plant developmental stage drives the diferentiation in ecological role of the maize microbiome

对应得图为:

注意这个堆积柱形图下面是有多个注释的,分别为 NicheStage 还有对应 3AirPlantSoil 的注释。今天我们探索一下怎么绘制。这篇文章没有提供数据,我们得自己随机生成一些数据来测试。

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群,欢迎加入下载。

群二维码:



老俊俊微信:




知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!




 往期回顾 




跟着 Science 学画图:多层柱形图

CIRCexplorer3 使用介绍

芯片数据分析神器:GEO2R

CIRCexplorer3: 对 circRNA 进行相对定量

circRNA-seq:CIRCexplorer2 使用指南(二)

circRNA-seq:CIRCexplorer2 使用指南(一)

手把手教你用在线 pheatmap 绘制热图

IGV 导入本地基因组及注释文件

关于 scale 函数和 pheatmap 的图例问题

Circular RNAs 的生物发生、功能和挑战

◀...

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存