跟着NatureGenetics学作图:R语言ggplot2做进化树图及添加不同形状的背景色块

论文

Reference genome assemblies reveal the origin and evolution of allohexaploid oat

https://www.nature.com/articles/s41588-022-01127-7#Sec31

论文中公开的数据处理流程

论文里还公布了所有图的原始数据,我们可以试着用论文中的原始数据来模仿出论文中的图

今天的推文我们来重复一下论文中的Figure3b 中的第一个树状图

image.png

ggtree所有树的布局

image.png

https://yulab-smu.top/treedata-book/chapter4.html

和论文中比较像的布局是 dayight这个布局

使用ggtree作图的时候

ggtree(tree01,layout = "daylight")+
  geom_tiplab()

使用daylight这个布局一直报错

Error: C stack usage 15924720 is too close to the limit

我现在用的R是4.0.3
换成4.1版本的R就没有这个问题

读取树文件

library(ggtree)
library(ggplot2)
library(ggforce)

vert.tree<-read.tree("data/20220725/tree01.nwk")

作图的时候最方便就是直接使用ggtree

ggtree(vert.tree)

ggtree(vert.tree,layout = "daylight")+
  geom_tiplab() -> p

ggtree(vert.tree,layout = "daylight")+
  geom_nodelab(aes(label=node))

p+geom_nodelab(aes(label=node))

p+geom_highlight(node=15,expand=0.01)

p+geom_highlight(node=15)+
  xlim(-0.15,0.1)+ylim(-0.1,0.2)

但是有些细节调整起来我还不清楚,最终出图效果如下

image.png

目前能想到的办法是

把作图数据单独提取出来,然后用ggplot2操作

ggplot_build(p)$data[[1]] -> df1

ggplot_build(p)$data[[2]] -> df2

ggplot_build(p)$data[[3]] -> df3

作图代码

ggplot()+
  geom_segment(data=df1,
               aes(x=x,y=y,xend=xend,yend=yend))+
  geom_text(data=df2,aes(x=x,y=y,
                         label=label,
                         angle=angle,
                         hjust=hjust,
                         vjust=vjust))+
  geom_text(data=df3,aes(x=x,y=y,
                         label=label,
                         angle=angle,
                         hjust=hjust,
                         vjust=vjust))+
  xlim(-0.15,0.1)+ylim(-0.1,0.2)+
  geom_mark_hull(data=data.frame(x=c(0.025,0.1,0.1,0.07),
                                 y=c(0.08,0.15,0.02,0.02)),
                 aes(x=x,y=y),
                 fill="red",
                 color="transparent",
                 #con.colour="white",
                 expand = unit(5,'mm'),
                 radius = unit(15,'mm'))+
  geom_mark_hull(data=data.frame(x=c(-0.05,-0.12,-0.15,-0.08,-0.13),
                                 y=c(0.08,0.15,0.08,-0.02,0.02)),
                 aes(x=x,y=y),
                 fill="blue",
                 color="transparent")+
  geom_mark_hull(data=data.frame(x=c(-0.025,0.02,0.075),
                                 y=c(-0.08,0.05,0)),
                 aes(x=x,y=y),
                 fill="orange",
                 color="transparent",
                 expand = unit(0,'mm'))+
  geom_mark_hull(data=data.frame(x=c(0,0,0.06),
                                 y=c(0.125,0.2,0.14)),
                 aes(x=x,y=y),
                 fill="darkgreen",
                 color="transparent",
                 expand = unit(3,'mm')) -> p1

p1

image.png

这里添加色块用到的函数是ggforce包中的geom_mark_hull()函数,这里比较麻烦的是还需要自己手动计算色块的边界坐标,算这些坐标还挺费时间的,还有一个问题是如何给色块添加渐变色

拼图

library(patchwork)

p1+p1+theme_void()
image.png

示例数据和代码可以自己到论文中获取,或者给本篇推文点赞,点击在看,然后留言获取

欢迎大家关注我的公众号

小明的数据分析笔记本

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

处理论文中进化树文件遇到的报错

论文中提供的数据是excel存储的,首先把进化树的内容复制到一个文本文件里

读取树文件

library(ggtree)
read.tree("data/20220725/tree01.nwk")

遇到报错

Error in nchar(tree) : invalid multibyte string, element 1

查了一下报错,有人提到可能是字符编码问题

https://community.rstudio.com/t/problem-importing-csv-file-in-r-error-in-make-names-x-invalid-multibyte-string-1/72802/2

使用readLines()函数读取的话可以 看到有一个字符是乱码

readLines("data/20220725/tree01.nwk")
image.png

对应着到进化树中去看发现其是用减号链接的字符,这样可能不行?

image.png

对应着把这个减号改成下划线就好了,如果确实想在图上体现这个减号,可以出图后再编辑

然后读取

read.tree("data/20220725/tree01.nwk")

又遇到报错

Error in FUN(X[[i]], ...) : 
  numbers of left and right parentheses in Newick string not equal

报错的意思就是进化树里的半括号数不匹配

搜索找到 参考

https://github.com/YuLab-SMU/ggtree/issues/432

有人说可能是进化树的文本标签 里有分号,我搜了一下我的没有

统计一下半括号的数量

readLines("data/20220725/Figure3b_1.txt") %>% 
  str_count("\\(")

readLines("data/20220725/Figure3b_1.txt") %>% 
  str_count("\\)")

一个13 一个14 确实不匹配

暂时想不到如何用代码去找是哪个括号多了,只能一个一个看了,还好进化树文件不多

把枝长信息去掉

readLines("data/20220725/Figure3b_1.txt") %>% 
  str_replace_all(":0.[0-9]+","")

把结果

((AbarCN65538_AB,(((Asat_Ogle_ACD_A,Sanfensan_ACD_A),(AlonCN58139_Al,AlonCN58138_Al)),((((AinsINS_4_CD_D,AinsCN108634_CD_D),AmarCN57945_CD_D),AmurCN21989_CD_D),(AagaCN25869_AB,(AcanCN23017_Ac,AdamCN19457_Ad)))))),(AnudCN58062_As,AstrCN88610_As),AwieCN90217_As);

放到rstudio写代码的地方,遇到逗号就换行,就能够找到多的那个右括号

但实际应该是少了一个左括号,在文件的最左边添加上就可以了

可能是在将树文件复制到excel的时候少选了一个左边的括号?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容