ggplot2版聚類物種豐度堆疊圖

2021-02-21 宏基因組
寫在前面

隨著研究的逐漸深入,我們對繪圖的要求越來越高,各種之前使用的較少的圖形如今追求熱度和新穎程度,都開始逐漸在大文章中顯現。如下圖。

這是最近剛發表於Nature Ecology & Evolution中的圖1b。如何繪製呢?

Thorsten Thiergart, Paloma Durán, Thomas Ellis, Nathan Vannier, Ruben Garrido-Oter, Eric Kemen, Fabrice Roux, Carlos Alonso-Blanco, Jon Ågren, Paul Schulze-Lefert & Stéphane Hacquard. Root microbiota assembly and adaptive differentiation among European Arabidopsis populations. Nature Ecology & Evolution 4, 122-131, doi:10.1038/s41559-019-1063-3 (2020).

這次的聚類加物種豐度展示讓我們學習一波。之前推出了用R語言的plot繪製的教程。

但修改細節仍比較麻煩。今天更新基於ggplot2系統的教程。

加載依賴關係

這裡的ggtree需要使用19年7月以後的版本,因為這以後的版本才支持將聚類結果轉化為樹結構。

如果你的Bioconductor版本較舊,可能一直會安裝舊版ggtree。升新方法如下:

## 先卸載先前的安裝控制程序
remove.packages(c("BiocInstaller", "BiocManager", "BiocVersion"))

## 再安裝新版程序
install.packages("BiocManager")
BiocManager::install(update=TRUE, ask=FALSE)

library("ggplot2")
library("ggdendro")
# library(remotes)
library(phyloseq)
library(tidyverse)
library(ggtree)
library( ggstance)
# library(amplicon)
vegan_otu = function(physeq){
OTU = otu_table(physeq)
if(taxa_are_rows(OTU)){
OTU = t(OTU)
}
return(as(OTU,"matrix"))
}

vegan_tax <- function(physeq){
tax <- tax_table(physeq)

return(as(tax,"matrix"))
}

導入數據

# 從R數據文件中讀入
# ps = readRDS("data/ps_liu.rds")

# 從文件讀取
metadata = read.table("http://210.75.224.110/github/EasyAmplicon/data/metadata.tsv", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors = F)
otutab = read.table("http://210.75.224.110/github/EasyAmplicon/data/otutab.txt", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors = F)
taxonomy = read.table("http://210.75.224.110/github/EasyAmplicon/data/taxonomy.txt", header=T, row.names=1, sep="\t", comment.char="", stringsAsFactors = F)

# 提取兩個表中共有的ID
# Extract only those ID in common between the two tables
idx = rownames(otutab) %in% rownames(taxonomy)
otutab = otutab[idx,]
taxonomy = taxonomy[rownames(otutab),]

# 使用amplicon包內置數據
# data("metadata")
# data(otutab)

# 導入phyloseq(ps)對象
ps = phyloseq(sample_data(metadata),otu_table(as.matrix(otutab), taxa_are_rows=TRUE), tax_table(as.matrix(taxonomy)))

ggtree繪製聚類樹

# 樣本間距離類型:Bray-Curtis
dist = "bray"
# phyloseq(ps)對象標準化
ps1_rela = transform_sample_counts(ps, function(x) x / sum(x) )
# 導出OTU表
otu = as.data.frame(t(vegan_otu(ps1_rela)))
# 預覽
otu[1:3,1:3]
#計算距離矩陣
unif = phyloseq::distance(ps1_rela , method=dist)
# 聚類樹,method默認為complete
hc <- hclust(unif, method = "complete")
# 對樹分組
clus <- cutree(hc, 3)
# 提取樹中分組的標籤和分組編號
d = data.frame(label = names(clus),
member = factor(clus))
# 提取樣本元數據
map = as.data.frame(sample_data(ps))
# 合併樹信息到樣本元數據
dd = merge(d,map,by = "row.names",all = F)
row.names(dd) = dd$Row.names
dd$Row.names = NULL
dd[1:3,1:3]

# ggtree繪圖 #----
p = ggtree(hc) %<+% dd +
geom_tippoint(size=5, shape=21, aes(fill=factor(Group), x=x)) +
# geom_tiplab(aes(label=Group), size=3, hjust=.5) +
geom_tiplab(aes(color = Group,x=x*1.2), hjust=1)
# theme_dendrogram(plot.margin=margin(6,6,80,6))# 這是聚類圖形的layout
p

物種組成數據

# 指定物種組成的選項
i = ps # 指定輸入數據
j = "Phylum" # 使用門水平繪製豐度圖表
rep = 6 # 重複數量是6個
Top = 10 # 提取豐度前十的物種注釋
tran = TRUE # 轉化為相對豐度值

# 按照分類學門(j)合併
psdata = i %>% tax_glom(taxrank = j)

# 轉化豐度值
if (tran == TRUE) {
psdata = psdata%>% transform_sample_counts(function(x) {x/sum(x)} )
}

#--提取otu和物種注釋表格
otu = otu_table(psdata)
tax = tax_table(psdata)
tax[1:3,1:7]

#--按照指定的Top數量進行篩選與合併
for (i in 1:dim(tax)[1]) {
if (row.names(tax)[i] %in% names(sort(rowSums(otu), decreasing = TRUE)[1:Top])) {
tax[i,j] =tax[i,j]
} else {
tax[i,j]= "Other"
}
}
tax_table(psdata)= tax

##轉化為表格
Taxonomies <- psdata %>% psmelt()
# head(Taxonomies)
Taxonomies$Abundance = Taxonomies$Abundance * 100

整理成facet需要的格式

這裡的格式也很簡單,就是需要一列「id」,這裡我們將樣本名修改為id,即可

# colnames(Taxonomies)[1] = "id"
Taxonomies$OTU = NULL
colnames(Taxonomies)[1] = "id"

保證顏色填充獨立性

因為我們顏色填充有好幾種方式,所以需要對每種顏色填充保重獨立性,使用ggnewscale。

library(ggnewscale)
p <- p + new_scale_fill()
p

分面組合樹和柱圖

p3 <- facet_plot(p, panel = 'Stacked Barplot', data = Taxonomies, geom = geom_barh,mapping = aes(x = Abundance, fill = as.factor(Phylum)),color = "black",stat='identity' )
p3

修改配色

colbar <- dim(unique(dplyr::select(Taxonomies, one_of(j))))[1]
colors = colorRampPalette(c("#CBD588", "#599861", "orange","#DA5724", "#508578", "#CD9BCD",
"#AD6F3B", "#673770","#D14285", "#652926", "#C84248",
"#8569D5", "#5E738F","#D1A33D", "#8A7C64","black"))(colbar)
p3 + scale_fill_manual(values = colors)

ggtree調整布局

修改layout,設置中空等。

p = ggtree(hc,layout="fan", branch.length = "none", ladderize = FALSE) %<+% dd +
geom_tippoint(size=5, shape=21, aes(fill=factor(Group), x=x)) +
geom_tiplab(aes(color = Group,x=x*1.2), hjust=1)
p = p + xlim(-4,NA)
p

添加樣本其他信息

如添加樣品測序量柱狀圖、數值標籤

p <- ggtree(hc) + theme_tree2()
p

head(dd)
dd$sequencenum = sample_sums(ps)
dd
data = data.frame(id = row.names(dd),sequencenum = dd$sequencenum )
head(data)
# p3
#----添加序列
p2 <- facet_plot(p, panel = 'Number Barplot', data = dd , geom = geom_barh,mapping = aes(x = sequencenum ,fill = Group),stat='identity' )
p2

facet_plot(p2, panel='Stacked Barplot',data=dd, geom=geom_text, mapping=aes(x=sequencenum+20, label=sequencenum))

樹+柱+堆疊圖組合

p3 <- facet_plot(p2, panel = 'Abundance Barplot', data = Taxonomies, geom = geom_barh,mapping = aes(x = Abundance, fill = as.factor(Phylum)),color = "black",stat='identity' )
p3

撰文:五穀雜糧

責編:劉永鑫 中科院遺傳發育所

猜你喜歡

10000+:菌群分析 寶寶與貓狗 梅毒狂想曲 提DNA發Nature Cell專刊 腸道指揮大腦

系列教程:微生物組入門 Biostar 微生物組  宏基因組

專業技能:學術圖表 高分文章 生信寶典 不可或缺的人

一文讀懂:宏基因組 寄生蟲益處 進化樹

必備技能:提問 搜索  Endnote

文獻閱讀 熱心腸 SemanticScholar Geenmedical

擴增子分析:圖表解讀 分析流程 統計繪圖

16S功能預測   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在線工具:16S預測培養基 生信繪圖

科研經驗:雲筆記  雲協作 公眾號

編程模板: Shell  R Perl

生物科普:  腸道細菌 人體上的生命 生命大躍進  細胞暗戰 人體奧秘  

寫在後面

為鼓勵讀者交流、快速解決科研困難,我們建立了「宏基因組」專業討論群,目前己有國內外5000+ 一線科研人員加入。參與討論,獲得專業解答,歡迎分享此文至朋友圈,並掃碼加主編好友帶你入群,務必備註「姓名-單位-研究方向-職稱/年級」。PI請明示身份,另有海內外微生物相關PI群供大佬合作交流。技術問題尋求幫助,首先閱讀《如何優雅的提問》學習解決問題思路,仍未解決群內討論,問題不私聊,幫助同行。

學習16S擴增子、宏基因組科研思路和分析實戰,關注「宏基因組」

點擊閱讀原文,跳轉最新文章目錄閱讀

相關焦點

  • 231.菌群物種組成堆疊柱狀圖、弦圖、詞雲
    所以樣本微生物群落的物種組成,通常在門、科和屬這幾個分類等級的豐度展示。文章中常見的微生物物種分布展示方式種類較多樣,使用頻率最多的是樣本或組的堆疊柱狀圖,來概述項目中門或屬等分類級中物種分類主體的種類和豐度組成。此外還有弦度、樹圖、詞雲,以及聚類+堆疊柱狀圖等展示方法。
  • 「花式」微生物群落堆疊圖,你見過幾種?
    堆疊圖之所以能在文章中擁有這麼高的曝光度,原因在於堆疊圖非常直觀、簡潔地展示樣本的群落物種組成組成信息。通常堆疊圖橫軸為各樣本名稱信息,縱軸為物種的相對豐度,每個樣本所有物種組成一個堆疊起來的柱子,柱子中通過顏色區分不同物種(如圖1)。例如在梯度處理或是不同時期的樣本展示中,我們就可以通過堆疊圖一目了然地展示優勢物種的變化情況或是某些病原微生物隨時間的豐度增長狀況。
  • 「花式」微生物群落堆疊圖,你見過幾種?
    通常堆疊圖橫軸為各樣本名稱信息,縱軸為物種的相對豐度,每個樣本所有物種組成一個堆疊起來的柱子,柱子中通過顏色區分不同物種(如圖1)。例如在梯度處理或是不同時期的樣本展示中,我們就可以通過堆疊圖一目了然地展示優勢物種的變化情況或是某些病原微生物隨時間的豐度增長狀況。
  • 微生物門類堆疊柱狀圖-衝擊圖-在R4.0更新版本
    寫在前面無論是堆疊柱狀圖,還是近年來會擴展的衝擊圖。基本都只能對門水平物種多樣性進行可視化。然而即使是門水平,也不一定是全部的樣本都適合使用堆疊柱狀圖可視化。尤其是土壤等複雜的微生物群落的環境,往往門水平的物種數量也在50個左右,或者有七八十個也是常見的。而堆疊柱狀圖一般可以展示的也就10個左右。過多無論是圖例,還是顏色,都無法進行很好的安排和調配。所以我們一般情況下展示的,都是主要的門類,也確實10個左右的門類基本代表了大部分的微生物。但在分析過程中卻存在較大問題。
  • 微生物群落基於KEGG預測功能的豐度分布圖繪製
    KEGG Orthology (KO)系統通過把分子網絡的相關信息連接到基因組中,提供了跨物種注釋流程。ko:表示通路,這個通路是不分物種的,相當於所有物種某一功能步驟的併集。第二層目前包括有 39 種子功能;第三層即為其代謝通路圖;第四層為每個代謝通路圖的具體注釋信息。
  • 雲平臺|OTU聚類的幾種算法!
    (OTU)進行物種注釋(即從OTU中選擇一天代表序列與資料庫進行比對獲得分類水平信息,便是該OTU的分類水平信息);如此操作,不僅簡化工作量,提高分析效率,而且OTU在聚類過程中還可以去除一些錯誤的序列,如嵌合體序列,提高分析的準確性。
  • 一文讀懂ggplot2數據可視化
    ggplot2的命令是一種用R實現的繪圖語言ggplot2的代碼相對容易理解,設定各種參數較為方便,圖形也十分美觀,能用相對簡單的代碼在圖形中呈現出非常豐富的信息。不過,ggplot2的語法與傳統R函數的調用方式有很大差別,所以不少人反映學起來有些困難。在ggplot2出現以前,R繪圖都是調用函數,再通過改變函數的參數實現的。
  • 美格基因|擴增子物種群落分析
    圖2 物種相對豐度柱狀圖橫坐標為樣品/分組名,縱坐標為相對豐度;堆疊柱為各分類水平相對豐度大於1%的分類群,其它相對豐度低於1%及注釋為unclassifed和unidentifed的則歸為others。
  • 集成聚類系列(三)圖聚類算法詳解
    圖聚類算法研究現狀聚類分析是一種常用的機器學習技術,它的目的是將一個數據點劃分為幾個類。同一個類的數據之間具有較高的相似性,不同的類之間的相似度較低。很多研究已表明圖聚類是一種極具競爭力的聚類算法,圖聚類是一種基於圖劃分理論的算法。與其他聚類算法相比,圖聚類算法有些明顯的優勢。
  • ItClust:單細胞RNA測序分析的聚類和細胞類型分類算法
    通過鑑定組織中不同的細胞類型,我們可以更好的理解:(1)同一物種不同組織之間細胞類型和功能的差異;(2)同一組織在不同發育階段的細胞類型的變化;(3)同一組織在健康和疾病狀態下細胞類型的差異。算法介紹(1)ItClust從構建一個堆疊自編碼器(stacked autoencoder)開始,利用該堆疊自編碼器以無監督
  • R繪圖:一文了解ggplot2顏色的設置
    R繪圖往期回顧:ggplot2繪圖學習 兩個連續性變量ggplot2繪圖學習:單變量+繪圖背景R繪圖
  • 史上最詳細版16S測序結果解讀,動動手指,趕快收藏吧!
    每個樣本或每組樣本可能存在一些共有OTU和特有OTU,通常用韋恩圖或花瓣圖展示,如下圖所示。此外,還可以基於每個樣本中OTU的豐度,進行PCA分析,初步觀察不同組樣本物種組成是否相似。如何從完整結果中找到OTU對應的微生物注釋結果呢?
  • 簡潔詳盡講解文本聚類
    起初,用於單詞和文檔的聚類的大量方法似乎不勝枚舉,讓我們仔細研究其中幾種。本文涵蓋的主題包括k均值,布朗聚類,tf-idf聚類,主題模型和潛在的Dirichlet分配(也稱為LDA)。聚類是數據科學中最大的主題之一,其規模如此之大,以至於你很容易會發現有大量書籍正探討它的每一個細節。文本聚類的子主題也不例外。
  • 有了K均值聚類,為什麼還需要DBSCAN聚類算法?
    K均值(點之間的距離)、Affinity propagation(圖之間的距離)、均值漂移(點之間的距離)、DBSCAN(最近點之間的距離)、高斯混合(到中心的馬氏距離)、譜聚類(圖之間距離)等。2014年,DBSCAN算法在領先的數據挖掘會議ACM SIGKDD上獲得the testof time獎(授予在理論和實踐中受到廣泛關注的算法)。
  • MagicHand雲平臺|物種與功能網絡與模型預測分析
    今天給大家介紹雲平臺宏基因組個性化分析之一:物種與功能網絡與模型預測分析。物種與功能網絡與模型預測分析物種與功能網絡與模型預測分析是針對特定的研究對象和目的,對特定的樣品及其數據集進行關聯與模型預測分析,進一步挖掘數據中的有效信息。
  • complexHeatmap版本的對角線熱圖
    寫在前面這幾天看到一直有人在重複這個圖,之前看到過base plot的版本,看到過ggplot2的版本。這裡就把之前使用complexheatmap繪製的版本也拿來和大家分享一下。主要操作加載包注意:ComplexHeatmap包的安裝需要安裝github版本的。很多函數在bioconductor版本沒有。