草庐IT

R语言|ggtreeExtra包绘制进化树

维凡生物 2023-03-28 原文

R包-ggtreeExtra绘制进化树

ggplot2提供的geom_tile图层可以画热图了,ggplot2的geom_point或者ggstar的geom_star可以绘制点图层。为了扩展ggtree在点和布局中的系统发育树的外环上呈现相关数据,开发的ggtreeExtra包提供了一个函数,geom_fruit用于将图形与树对齐,相关图表将在树的外部面板的不同位置对齐。还开发geom_fruit_list在树的同一个外部面板上添加多个层。一些函数基于ggplot2并支持使用图形语法。

绘图示例

1、下载安装ggtreeExtra包

if(!requireNamespace("remotes", quietly=TRUE)){
  install.packages("remotes")
}
remotes::install_github("YuLab-SMU/ggtreeExtra")
if (!requireNamespace("BiocManager", quietly=TRUE))
  install.packages("BiocManager")
BiocManager::install("ggtreeExtra")
BiocManager::install("ggstar")
# 下载"ggstar","ggplot2","ggtree","treeio","ggnewscale"包
install.packages("ggstar")
install.packages("ggplot2")
install.packages("ggtree")
install.packages("treeio")
install.packages("ggnewscale")

2、加载依赖包

library(ggtreeExtra) # 设置叠加的包
library(ggstar) # 提供几何图形
library(ggplot2) # 
library(ggtree) # 绘制进化树
library(treeio)
library(ggnewscale) # 创建新的scale,多个fill或者color

3、设置工作目录

setwd("D:/R/ggtreeExtra")

4、数据来源

# 树状图数据来源路径
trfile <- system.file("extdata", "tree.nwk", package="ggtreeExtra")
# 绘制点图和柱状图的数据来源路径
tippoint1 <- system.file("extdata", "tree_tippoint_bar.csv", package="ggtreeExtra")
# 树外第一层的绘制热图来数据源路径
ring1 <- system.file("extdata", "first_ring_discrete.csv", package="ggtreeExtra")
# 树外第二层的绘制热图来数据源路径
ring2 <- system.file("extdata", "second_ring_continuous.csv", package="ggtreeExtra")

5、获取数据

树文件是使用 read . tree 导入的。如果有其他树格式的文件,可以使用 tree io 包的相应函数来读取.

tree <- read.tree(trfile)
data = fortify(tree)
head(data)
image.png

6、绘制树状图

# 可视化进化树,这里图形选用的是"fan",还可以是 'rectangular', 'dendrogram', 'slanted', 'ellipse', 'roundrect', 'circular', 'circular', 'inward_circular', 'radial', 'equal_angle', 'daylight' or 'ape'
p <- ggtree(tree, layout="fan", open.angle=10, size=0.5)
p
image.png

7、获取数据集绘制图

dat1 <- read.csv(tippoint1)
knitr::kable(head(dat1))
dat2 <- read.csv(ring1)
knitr::kable(head(dat2))
dat3 <-read.csv(ring2)
knitr::kable(head(dat3))
head(dat3)

dat1数据集用来绘制成点和条形图


image.png

dat2数据集用于绘制热图


image.png

dat3数据集用于绘制热图


image.png

a、绘制点图层

p2 <- p + 
  geom_fruit(
    data=dat1,
    geom=geom_star,
    mapping=aes(y=ID, fill=Location, size=Length, starshape=Group),
    position="identity",
    starstroke=0.2
  ) + 
  scale_size_continuous(
    range=c(1, 3), # 大小范围
    guide=guide_legend(
      keywidth=0.5,  # 箱体宽度0.5
      Keyheight=0.5, # 箱体宽度0.5
      override.aes=list(starshape=15),
      order=2
    )
  ) +
  scale_fill_manual(
    values=c("#F8766D", "#C49A00", "#53B400", "#00C094", "#00B6EB", "#A58AFF", "#FB61D7"),
    guide="none" 
  ) + 
  scale_starshape_manual(
    values=c(1, 15),
    guide=guide_legend(
      keywidth=0.5,
      keyheight=0.5,
      order=1
    )
  )
p2
image.png

b、绘制热图层

p3 <- p2 + 
  new_scale_fill() + 
  geom_fruit(
    data=dat2,
    geom=geom_tile,
    mapping=aes(y=ID, x=Pos, fill=Type),
offset=0.08,   # 外部层之间的距离,默认为树的 x 范围的0.03倍。
pwidth=0.25  # 外部层的宽度,默认为树的 x 范围的0.2倍。
  ) + 
  scale_fill_manual(
    values=c("#339933", "#dfac03"),
guide=guide_legend(
keywidth=0.5,
keyheight=0.5, 
order=3
)
  ) 
p3
image.png

c、绘制热图层

p4 <- p3 + 
  new_scale_fill() +
  geom_fruit(
    data=dat3,
    geom=geom_tile,
    mapping=aes(y=ID, x=Type2, alpha=Alpha, fill=Type2),
    pwidth=0.15,
    axis.params=list(
      axis="x", # 添加图层的轴文本
      text.angle=-45, #x 轴的文本角度
hjust=0  # 调整文字轴的水平位置
    )
  ) +
  scale_fill_manual(
    values=c("#b22222", "#005500", "#0000be", "#9f1f9f"),
    guide=guide_legend(keywidth=0.5, keyheight=0.5, order=4)
  ) +
  scale_alpha_continuous(
range=c(0, 0.4), # alpha的范围
guide=guide_legend(keywidth=0.5, keyheight=0.5, order=5)
  ) 
p4
image.png

d、绘制柱状图层

p5 <- p4 + 
  new_scale_fill() +
  geom_fruit(
    data=dat1,
    geom=geom_bar,
mapping=aes(y=ID, x=Abundance, fill=Location),  # dat 1的Abundance将被映射到 x   
pwidth=0.4,
    stat="identity",
    orientation="y", # 轴的方向
    axis.params=list(
      axis="x", # 添加图层的轴文本
text.angle=-45, # 轴的文字大小
      hjust=0  # 调整轴文本的水平位置
    ),
    grid.params=list() # 添加外部条形图的网格线
  ) + 
  scale_fill_manual(
    values=c("#F8766D", "#C49A00", "#53B400", "#00C094", "#00B6EB", "#A58AFF", "#FB61D7"),
    guide=guide_legend(keywidth=0.5, keyheight=0.5, order=6)
  ) +
  theme(#legend.position=c(0.96, 0.5), # 图例位置
    legend.background=element_rect(fill=NA), # 图例背景
    legend.title=element_text(size=7), # 图例标题大小
    legend.text=element_text(size=6), # 图例文本标签大小
    legend.spacing.y = unit(0.02, "cm")  # 调节y轴图例的距离
  ) 
p5
image.png

END

有关R语言|ggtreeExtra包绘制进化树的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  3. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  6. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  7. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  8. ruby-on-rails - 如何通过 URL 更改语言环境? - 2

    在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改

  9. ruby - 一种语言如何被自身解释(如 Rubinius)? - 2

    我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编

  10. ruby-on-rails - ruby 真的是一种完全面向对象的语言吗? - 2

    Ruby是完全面向对象的语言。在ruby​​中,一切都是对象,因此属于某个类。例如5属于Objectclass1.9.3p194:001>5.class=>Fixnum1.9.3p194:002>5.class.superclass=>Integer1.9.3p194:003>5.class.superclass.superclass=>Numeric1.9.3p194:005>5.class.superclass.superclass.superclass=>Object1.9.3p194:006>5.class.superclass.superclass.superclass.su

随机推荐