跟着Molecular Plant学作图:R语言circlize包画圈图展示基因组的一些特征补充添加图例

简介: 跟着Molecular Plant学作图:R语言circlize包画圈图展示基因组的一些特征补充添加图例

论文

A telomere-to-telomere gap-free reference genome of watermelon and its mutation library provide important resources for gene discovery and breeding

今天的推文我们重复一下论文中的Figure1a

image.png

之前的推文介绍了如何绘制外圈的圈图,但是当时不知道如何实现图例,后来想了一下,图例其实可以用ggplot2来做,然后把ggplot2的内容叠加的circlize的图上。搜索了一下这种思路的实现代码,找到链接

https://cran.r-project.org/web/packages/ggplotify/vignettes/ggplotify.html

image.png

image.png

按照这个思路来构建图例

图例里就是各种点 线段 文字的组合,所以先构造这些元素的坐标,然后用ggplot2的代码依次叠加,这种方式我觉得稍微有些麻烦,但是目前还想不到比较好的办法

图例构造数据和画图的代码

library(ggplot2)
text.df01<-data.frame(
  x=0.0125,
  y=c(1,3,5,7,9),
  label=c("InDels","SNPs",
          "TE density","Gene density",
          "GC content")
)

text.df02<-data.frame(
  x=-0.0125,
  y=c(3,7),
  label=c("Inner","Outer")
)

segment.df01<-data.frame(
  x=0.025,
  xend=0.025,
  y=c(0.5,2.5,8.5),
  yend=c(1.5,3.5,9.5)
)
segment.df02<-data.frame(
  x=0.025,xend=0.027,
  y=c(0.5,1.5,2.5,3.5,8.5,9.5),
  yend=c(0.5,1.5,2.5,3.5,8.5,9.5)
)

text.df03<-data.frame(
  x=0.030,
  y=c(0.5,1.5,2.5,3.5,8.5,9.5),
  label=c(0,446,0,3270,0.25,0.35)
)

point.df01<-data.frame(
  x=c(0.025,0.035),
  y=c(5)
)

point.df02<-data.frame(
  x=c(0.025,0.03,0.035),
  y=c(7)
)

text.df04<-data.frame(
  x=c(0.025,0.025,0.035,0.035),
  y=c(5,7,5,7),
  label=c("Low","Low","High","High")
)
ggplot()+
  geom_segment(aes(x=0,y=10,xend=0,yend=0),
               arrow = arrow(angle=20,
                             type = "closed",
                             length = unit(5,'mm')),
               size=1)+
  geom_segment(aes(x=0,y=10,xend=0,yend=1),
               size=1)+
  geom_text(data=text.df01,
            aes(x=x,y=y,label=label),
            size=2)+
  geom_text(data=text.df02,aes(x=x,y=y,label=label),
            size=2)+
  geom_segment(data=segment.df01,
               aes(x=x,y=y,xend=xend,yend=yend),
               color=c("#d3026e","#1e4793",'#860a3b'),
               size=0.5)+
  geom_segment(data=segment.df02,
               aes(x=x,y=y,xend=xend,yend=yend),
               color=c("#d3026e","#d3026e",
                       "#1e4793","#1e4793",
                       '#860a3b','#860a3b'),
               size=0.5)+
  geom_text(data=text.df03,
            aes(x=x,y=y,label=label),
            size=2,hjust=1)+
  geom_point(data=point.df01,
             aes(x,y),
             shape=15,
             color=c("#0037ff","#fd0200"),
             size=2)+
  geom_point(data=point.df02,
             aes(x,y),
             shape=15,
             color=c("#1efc05","#000000","#fc0003"),
             size=2)+
  geom_text(data=text.df04,
            aes(x=x,y=y,label=label),
            vjust=-2,
            size=2)+
  theme_void() +
  xlim(-0.02,0.04) -> p1
p1

image.png

然后是圈图叠加图例的代码

最终结果

library(circlize)
library(grid)
library(ggplotify)
brk <- seq(0,40,by=2)*10^6
brk.label<-c()
for (i in brk){
  ifelse(i%%10^7==0,brk.label<-append(brk.label,
                                      paste0(i/10^7,"0M")),
         brk.label<-append(brk.label,""))
}
brk.label[1]<-"0M"
brk.label

#circos.par(points.overflow.warning = FALSE)
pdf(file = "mp.pdf",
    width = 10,height = 10)

circos.par(start.degree =86,clock.wise = T,
           #track.height=0.00001,
           track.margin = c(.001,0.001))
circos.initialize(factors = df$chr_id, 
                  xlim = matrix(c(rep(0,11),df$chr_len),ncol=2))
circos.trackPlotRegion(df$chr_id, 
                       ylim = c(0, 10),
                       track.height = 0.1,
                       bg.border = NA, 
                       #ylim=CELL_META$ylim,
                       panel.fun = function(x, y) {
                         circos.text(mean(CELL_META$xlim), 12, 
                                     get.cell.meta.data("sector.index"))
                       })

circos.trackPlotRegion(df$chr_id, 
                       ylim = c(0, 100),
                       track.height = 0.1,
                       bg.col = '#EEEEEE6E', 
                       bg.border = NA)


for (chromosome in df$chr_id){
  circos.axis(sector.index = chromosome,
              h = 110,
              major.at = brk,
              minor.ticks = 0,
              labels = brk.label,
              labels.facing="clockwise",
              labels.cex = 0.6)
}

circos.trackLines(gc$chr_id,gc$bin_start,gc$gc,
                  area = TRUE,
                  col = "red",
                  border="transparent")

circos.trackPlotRegion(df$chr_id, 
                       ylim = c(0, 10),
                       track.height = 0.1,
                       bg.col = '#EEEEEE6E', 
                       bg.border = NA)

for (chromosome in df$chr_id){
  circos.segments(sector.index = chromosome,
                  x0=genedensity[genedensity$chr_id==chromosome,]$bin_start,
                  x1=genedensity[genedensity$chr_id==chromosome,]$bin_start,
                  y0=0,y1=10,col=genedensity[genedensity$chr_id==chromosome,]$group)
}


circos.trackPlotRegion(df$chr_id, 
                       ylim = c(0, 10),
                       track.height = 0.1,
                       bg.col = '#EEEEEE6E', 
                       bg.border = NA)

for (chromosome in df$chr_id){
  circos.segments(sector.index = chromosome,
                  x0=genedensity[genedensity$chr_id==chromosome,]$bin_start,
                  x1=genedensity[genedensity$chr_id==chromosome,]$bin_start,
                  y0=0,y1=10,col=genedensity[genedensity$chr_id==chromosome,]$group)
}

circos.trackPlotRegion(df$chr_id, 
                       ylim = c(0, 100),
                       track.height = 0.1,
                       bg.col = '#EEEEEE6E', 
                       bg.border = NA)

for (chromosome in df$chr_id){
  circos.barplot(sector.index = chromosome,
                 value = genedensity[genedensity$chr_id==chromosome,]$gene_count,
                 pos = genedensity[genedensity$chr_id==chromosome,]$bin_start,
                 col = "red",
                 bar_width = 500000,
                 border="transparent")
}

circos.trackPlotRegion(df$chr_id, 
                       ylim = c(0, 100),
                       track.height = 0.1,
                       bg.col = '#EEEEEE6E', 
                       bg.border = NA)

for (chromosome in df$chr_id){
  circos.barplot(sector.index = chromosome,
                 value = genedensity[genedensity$chr_id==chromosome,]$gene_count,
                 pos = genedensity[genedensity$chr_id==chromosome,]$bin_start,
                 col = "blue",
                 bar_width = 500000,
                 border="transparent")
}

p2 <- as.grob(p1)
vp = viewport(x=.5, y=.5, width=.2, height=.2)
pushViewport(vp)
grid.draw(p2)
upViewport()
circos.clear()
dev.off()

image.png

有些文字的位置不是太合适,需要出图后调整

这里遇到一个问题是,我想把中间的空白区间刘大一点,我想到的是把每一圈的轨道宽度设置小一点,但是暂时没有找到参数进行设置,找到一个track.height好像不起作用。

构造图例的时候需要反复调整每个元素的位置坐标,还挺耗时间的

示例数据和代码可以给公众号推文点赞,点击在看,最后留言获取

欢迎大家关注我的公众号

小明的数据分析笔记本

小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!

image.png

相关文章
|
3月前
|
存储 数据采集 数据处理
R语言数据变换:使用tidyr包进行高效数据整形的探索
【8月更文挑战第29天】`tidyr`包为R语言的数据整形提供了强大的工具。通过`pivot_longer()`、`pivot_wider()`、`separate()`和`unite()`等函数,我们可以轻松地将数据从一种格式转换为另一种格式,以满足不同的分析需求。掌握这些函数的使用,将大大提高我们处理和分析数据的效率。
|
14天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
38 3
|
6月前
【R语言实战】——fGARCH包在金融时序上的模拟应用
【R语言实战】——fGARCH包在金融时序上的模拟应用
|
6月前
|
存储 算法 Windows
课程视频|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例(下)
课程视频|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例
|
6月前
|
算法 数据可视化 数据挖掘
课程视频|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例(上)
课程视频|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例
|
6月前
|
数据挖掘 开发工具 Android开发
R语言对git安卓包分类统计、聚类、复杂网络可视化分析
R语言对git安卓包分类统计、聚类、复杂网络可视化分析
|
6月前
|
前端开发 数据挖掘 数据建模
课程视频|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例(中)
课程视频|R语言bnlearn包:贝叶斯网络的构造及参数学习的原理和实例
|
6月前
|
前端开发
R语言实现随机前沿分析SFA、数据包络分析DEA、自由处置包分析FDH和BOOTSTRAP方法
R语言实现随机前沿分析SFA、数据包络分析DEA、自由处置包分析FDH和BOOTSTRAP方法
|
6月前
Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
|
6月前
|
机器学习/深度学习 数据可视化 算法
从零到精通:学习这些R语言必学包成为数据分析高手!
从零到精通:学习这些R语言必学包成为数据分析高手!
183 0