查看原文
其他

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

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


点击上方关注“公众号”


1、发生

昨晚躺床上看到小明哥的推文:跟着 Science 学画图:R 语言 ggplot2 实现图中嵌图,跟着小明哥的代码即可复现出 Science 文章里的这篇图:

下面是明哥最终复现的图,可以看到基本上非常相似了,很棒:

然后明哥提出了如何绘制下面的 注释矩形图 这个问题,因为原文没有给代码 ,今天尝试了一下,是可以完成的。

2、绘图

我们先进行绘制堆积柱形图:

# 设置工作目录
setwd('c:/Users/admin/Desktop/')

# 加载包
library(dplyr)
library(ggplot2)
library(ggnewscale)
library(ggsci)

# 读取数据
df <- read.delim("pan_matrix_stats.csv",row.names = 1,sep = ",")

# 查看内容
head(df,3)
             class    Subgenome number_genome_presence     n
1     Private Gene Non-Syntenic                      1 19576
2        Core Gene Non-Syntenic                     26 10618
3 Dispensable Gene Non-Syntenic                      2 10436

绘制堆积图:

# 绘制柱形堆积图
p <- ggplot(df,aes(x = number_genome_presence)) +
  geom_bar(aes(fill = Subgenome,y = n),
           position = "stack",
           # 柱子宽度
           width = 0.9,
           stat = "identity") +
  # 控制颜色过渡,图例名称
  scale_fill_grey(start = 0.7,end = 0.2,name = 'Maize Subgenomes') +
  labs(x = 'Number of Genomes',y = 'Number of Pan-Genes') +
  # 经典主题
  theme_classic(base_size = 16) +
  # 图例位置
  theme(legend.position = 'top') +
  # y轴范围
  scale_y_continuous(limits = c(-1500,30000)) +
  # x轴显示刻度
  scale_x_continuous(breaks = seq(1:26))

p

然后添加标签:

# 添加标签

# 构造标签数据
df %>% group_by(number_genome_presence) %>%
  summarise(sum = sum(n)) %>% as.data.frame() -> text_data

# 查看内容
head(text_data,3)
  number_genome_presence   sum
1                      1 19888
2                      2 10614
3                      3  6442

# 添加
p1 <- p + geom_text(data = text_data,
                    aes(x = number_genome_presence,y = sum + 100,label = sum),
                    # 标签角度及对齐
                    angle = 90,hjust = 0,vjust = 0.5,
                    size = 3)

p1

接下来我们在柱形图下方添加 矩形注释三种颜色 的注释。前面我们设置了每根 柱子的宽度是 0.9,而横坐标每个刻度对准了柱子的中间,所以可以计算出每根柱子的 起始位置终止位置,这样就可以添加多个矩形注释了,下面是示意图:

# 构建矩形注释数据
anno <- data.frame(number_genome_presence = 1:26,type = c(1,rep(2,22),rep(3,2),4))
anno$xmin <- anno$number_genome_presence - 0.45
anno$xmax <- anno$number_genome_presence + 0.45

# 查看数据
head(anno,3)
  number_genome_presence type xmin xmax
1                      1    1 0.55 1.45
2                      2    2 1.55 2.45
3                      3    2 2.55 3.45

# 添加注释
p2 <- p1 + new_scale('fill') +
  geom_rect(data = anno,
            aes(fill = factor(type),
                xmin = xmin,
                xmax = xmax,
                ymin = -1500,ymax = -200),
            show.legend = F) +
  # 修改颜色
  scale_fill_manual(values = c('#1EAE98','#00C1D4','#001E6C','#FF3F00'))

p2

接下来绘制饼图:

# 构造饼图数据
pie <- data.frame(name = c("Core Gene""Dispensable Gene","Private Gene","Near-Core Gene"),
                  per = c(27.09,49.59,19.30,4.02))

# 按图中顺序排列
pie$name <- factor(pie$name,levels = pie$name)

# 绘制饼图
pie_plot <- ggplot(pie,aes(x = '',y = per,fill = name)) +
  geom_bar(stat = 'identity',width = 1,show.legend = F) +
  coord_polar(theta = 'y') +
  theme_void() +
  scale_fill_npg()

# 将饼图添加到堆叠柱形图里
ppie <- ggplotGrob(pie_plot)

pcombing <- p2 + annotation_custom(grob = ppie,
                       xmin = 5,
                       xmax = 22,
                       ymin = 12000,
                       ymax = 28000)

pcombing

最后添加注释:

# 给饼图添加注释
pcombing +
  annotate("text", x = 8, y = 22000,
           label = "Core Genes: 27.09%",size = 4) +
  annotate("text", x = 15, y = 28050,
           label = "Near-Core Genes: 4.02%",size = 4) +
  annotate("text", x = 14, y = 17000,
           label = "Dispensable Genes: 49.59%",size =4) +
  annotate("text", x = 17, y = 23000,
           label = "Private Genes: 19.30%",size = 4)

当然也参考了明哥的一些代码。最后祝大家中秋快乐!

3、今晚的药大夜空



欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 哦, 数据和代码已上传至 QQ群,欢迎加入下载。

群二维码:



老俊俊微信:




知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

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

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

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




 往期回顾 




CIRCexplorer3 使用介绍

芯片数据分析神器:GEO2R

CIRCexplorer3: 对 circRNA 进行相对定量

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

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

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

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

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

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

@你需要提高一下 R 技能了(plyr 包)

◀...


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

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