高分文章复现系列1-瀑布图(有实操代码)

今天看到一篇高分文章(IF=11.4,PMID :33546774)里的一副图很漂亮,忍不住想要复现一下,下面给小伙伴们分享下完整的复现过程。先看下原图和复现后的图对比吧!

文章原图

image.png

复现后的图

image.png

  1. 原文数据下载及整理

    把文章附件中的突变数据表下载下来,这里我已经下载好了,你们拿来用就行。


    image.png

    然后需要对数据格式进行整理,这一步我是通过R语言代码来实现的,具体代码如下:

# 程序包安装---
if(!"openxlsx" %in% installed.packages()){install.packages('openxlsx')}
if(!"dplyr" %in% installed.packages()){install.packages('dplyr')}
if(!"tidyverse" %in% installed.packages()){install.packages('tidyverse')}
if(!"aplot" %in% installed.packages()){install.packages('aplot')}

安装好程序包后,加载程序包(加载的时候注意每个程序包是否都安装成功,可以正常加载)。注意程序包版本!!!

# 加载程序包,注意程序包版本!!!---
library(openxlsx)
library(dplyr)
library(tidyverse)
library(aplot) # 版本 0.2.2
library(ggplot2) # 版本 3.2.0

读取数据提取画图用到的基因,并计算基因突变比例。

# 数据读取
df <- read.xlsx("./40164_2021_200_MOESM2_ESM.xlsx",check.names = F)

读取的数据格式如下:


image.png
# 整理画热图部分的数据
gene_list <- c("CHD3","APC","TP53","PALB2",
               "FANCA","TET2","DNMT3A","IDH2",
               "ARID1A","ARID1B","MLL3","TYK2",
               "STAT3","LRRK2","MAP2K1","PCLO",
               "PIEZO1","FAT3","CSMD1","NSD1",
               "MKI67","WDR90","MGA","CPS1",
               "SPEN","ATP10B","ANKRD11","RELN",
               "PLCG1","ALK","FLT4","RHOA",
               "NOTCH1","NOTCH4")

# 基因突变比例
mut_per <- df %>% 
  dplyr::filter(Gene.Symbol %in% gene_list) %>% 
  group_by(PatientID,Gene.Symbol) %>% 
  summarise(n=n()) %>%
  group_by(Gene.Symbol,n) %>% 
  summarise(nsub=n(),per = nsub/53)

mut_per <- aggregate(mut_per$per, by=list(type = mut_per$Gene.Symbol),sum) %>%
  dplyr::rename(per = 'x') %>%
  dplyr::rename(Gene.Symbol = 'type')

heat_df <- df %>%
  # 挑选画图基因
  dplyr::filter(Gene.Symbol %in% gene_list) %>%
  dplyr::select(Gene.Symbol,PatientID,Function) %>%
  dplyr::rename(Alterations = Function) %>%
  merge(mut_per, ., by = 'Gene.Symbol') %>%
  dplyr::mutate(mut_pct = round(per * 100,0))

整理后的数据格式heat_df如下:


image.png

对基因进行因子化,固定排列顺序,同时修改突变类型注释信息。

# 因子化,固定基因排列顺序
heat_df$Gene.Symbol <- factor(heat_df$Gene.Symbol,levels = gene_list)

# 突变类型修改
heat_df[heat_df$Alterations == 'cds-del', 'Alterations'] <- 'CDs-Indel'
heat_df[heat_df$Alterations == 'missense', 'Alterations'] <- 'Missense'
heat_df[heat_df$Alterations == 'nonsense', 'Alterations'] <- 'Nonsense'
heat_df[heat_df$Alterations == 'frameshift', 'Alterations'] <- 'FrameShift'
heat_df[heat_df$Alterations == 'splice-5' | heat_df$Alterations == "splice-3", 'Alterations'] <- 'Splicing'

2. 画热图

先画主体的热图,利用ggplot2来画图。根据基因通路分类和样本分组设置分割线,代码如下:

p1 <- ggplot(heat_df, aes(factor(PatientID), fct_rev(Gene.Symbol)))+
  geom_tile(aes(fill = Alterations), color = 'white') +
  labs(x=NULL,y=NULL) +
  theme(axis.text.x = element_blank(),
        axis.ticks = element_blank(),
        axis.text.y = element_text(size = 20, face = 'italic'),
        legend.title = element_text(size = 25, face = 'bold'),
        legend.text = element_text(size = 20, face = 'italic'),
        panel.border = element_blank()) +
  scale_fill_manual(values = c('Missense' = '#103b75',
                               'CDs-Indel' = '#fc9408',
                               'Nonsense' = '#f2030d',
                               'FrameShift' = '#1ffffd',
                               'Splicing' = '#8e02e7')) +
  geom_hline(yintercept=c(3.5, 5.5, 7.5, 19.5, 21.5, 23.5, 29.5, 32.5),
             size = 3,
             color = 'white') +
  geom_vline(xintercept=c(30.5, 36.5, 40.5),
             size = 3,
             color = 'white')
image.png

3. 画右侧的通路注释信息

这一步需要注意的是通过annotate来指定通路注释的位置!!!

# 画右侧通路注释
ann_df = ggplot() +
  annotate(geom = 'text', x = 0, y = 1.7, label = 'T-cell activation', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 4.5, label = 'RTK signaling pathway', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 6.5, label = 'PI3K/AKT pathway', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 13.5, label = 'Other signaling pathway', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 20.5, label = 'MAPK pathway', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 22.5, label = 'JAK-STAT pathway', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 26.5, label = 'Epigenetic Remoldling', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 31, label = 'DNA repair/TP53 pathway', hjust = 0, size = 6, fontface='italic') +
  annotate(geom = 'text', x = 0, y = 33.5, label = 'APC(Wnt) pathway', hjust = 0, size = 6, fontface='italic') +
  xlim(0,0.02) +
  theme_bw() +
  theme(axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_blank(),
        panel.border = element_blank(),
        panel.grid = element_blank())

4. 画上面的样本突变柱状图

# 上部条形图部分
bar_df <- heat_df %>% count(PatientID, Alterations)
p2 <- ggplot(bar_df, aes(factor(PatientID),n))+
  geom_bar(stat = "identity", aes(fill = Alterations))+
  scale_y_continuous(name = NULL,expand = c(0,0))+
  scale_x_discrete(name = NULL)+
  theme_classic()+
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.title = element_blank(),
        axis.line.x = element_blank(),
        axis.text.y = element_text(size = 20, face = 'italic'),
        axis.line.y = element_line(color = "black",size = 1.1),
        axis.ticks.y = element_line(color = "black",size = 1.1),
        legend.position = "none") +
  scale_y_continuous(expand = c(0.03,0.03)) +
  scale_fill_manual(values = c('Missense' = '#103b75',
                               'CDs-Indel' = '#fc9408',
                               'Nonsense' = '#f2030d',
                               'FrameShift' = '#1ffffd',
                               'Splicing' = '#8e02e7'))
image.png

5.画左侧基因突变频率柱状图

# 突变频率注释
bar_mut <- heat_df[!duplicated(heat_df$Gene.Symbol),]
bar_mut$Gene.Symbol <- factor(bar_mut$Gene.Symbol, levels = gene_list)

p3 <- ggplot(bar_mut, aes(fct_rev(Gene.Symbol),mut_pct))+
  geom_bar(stat = "identity")+
  coord_flip() +
  # scale_x_continuous(name = NULL,expand = c(0,0))+
  # scale_x_discrete(name = NULL)+
  theme_bw()+
  theme(axis.text.x = element_text(size = 20, face = 'italic'),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(),
        panel.grid = element_blank(),
        axis.title = element_blank(),
        plot.title = element_text(size = 20, hjust = .5),
        panel.border = element_rect(size = 1.5),
        legend.position = "none") +
  labs(title = 'Mutations Percent', y = '', x = '')
p3
image.png

6. 画底部的注释信息

p4 <- ggplot() +
  annotate(geom = 'text', y = 0.01, x = 15, label = 'AITL', 
            size = 5, fontface ='bold', color = 'black') +
  annotate(geom = 'rect', xmin = 0, xmax = 30.2, ymin = 0,
           ymax = 0.02, alpha = .3, fill = '#23ff07', color = 'black') +

  annotate(geom = 'text', y = 0.01, x = 33, label = 'ALK- \nALCL', 
           size = 5, fontface ='bold', color = 'black') +
  annotate(geom = 'rect', xmin = 30.6, xmax = 36.2, ymin = 0, 
           ymax = 0.02, alpha = .3, fill = '#22fffe', color = 'black') +

  annotate(geom = 'text', y = 0.01, x = 38.5, label = 'ALK+ \nALCL', 
           size = 5, fontface = 'bold', color = 'black') +
  annotate(geom = 'rect', xmin = 36.6, xmax = 40.2, ymin = 0, 
           ymax = 0.02, alpha = .3, fill = '#23ff07', color = 'black') +

  annotate(geom = 'text', y = 0.01, x = 45, label = 'PTCL-NOS', 
           size = 5, fontface = 'bold', color = 'black') +
  annotate(geom = 'rect', xmin = 40.7, xmax = 50.5, ymin = 0, 
           ymax = 0.02, alpha = .3, fill = '#22fffe', color = 'black') +
  theme_bw() +
  theme(axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_blank(),
        panel.border = element_blank(),
        panel.grid = element_blank())
image.png

7. 图片拼图

最后就是把我们上述画的几张图拼接起来,我这里用的是aplot程序包进行拼图。然后保存图片即可。

pic <- p1 %>% 
  insert_right(ann_df, width = 0.3) %>%
  insert_bottom(p4, height = 0.1) %>%
  insert_top(p2, height = 0.2) %>%
  insert_left(p3, width = 0.3)

  ggsave(plot = pic, device = 'png', dpi = 300,
       width = 19, height = 12, './heatmap2.png')

完整的全部代码,文章数据我都整理放百度网盘了,私我-->获取百度网盘链接(永久有效)!

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

推荐阅读更多精彩内容