交互式探索微生物群落与生态功能的关系

微生物群落在生态系统中发挥则重要功能,我们在对微生物群落进行分析时,会将不同分类水平(从门到属)的微生物类群的相对丰度与测定的某一生态功能进行相关性分析。但由于微生物类群数较多,又有不同的分类水平,将其包揽在一个图中,并显示不同的微生物类群的名字,会显得十分杂乱,因此我们尝试使用交互式的可视化来进行探索性分析。下面我们将结合R语言和javascript,来实现这一任务。考虑到微生物生态学方面的同学对JavaScript可能比较陌生,我们也提供了网络工具,为网友在线探索分析微生物各类群与生态功能的关系提供便利。

实现的效果:可点击该连接查看实现的效果,TreeCorrelation,鼠标停留在每一个节点可以显示每个节点的微生物类群名称。

例如,当鼠标停留在图中的蓝色节点时会显示其对应的名称,鼠标移开后名称消失,保持图形的整洁。

看完了实现效果,下面具体介绍实现该交互式网页的方法

Step1:数据准备

我们需要使用到两大类的数据:各水平相对丰度表测定的生态功能表

  • 门水平相对丰度表
  • 纲水平相对丰度表
  • 目水平相对丰度表
  • 科水平相对丰度表
  • 属水平相对丰度表
  • 生态功能表(测定的生态功能,或者对应的理化性质等)

我们需要使用到个分类水平的相对丰度表,这个在进行完序列分析后都可以获得,其数据格式如下,这里以门水平的相对丰度表为例,纲、目、科、属水平的相对丰度表也类似。

准备好生态功能的数据表

Step2:利用R语言生成JSON文件
2.1 加载必要的包
r 复制代码
library(jsonlite)
library(stringr)
library(psych)
2.2 读取文件
r 复制代码
L2 <- read.delim("./icicle data/taxa_nifH_16s_L2.txt", row.names=1, check.names = FALSE)
L3 <- read.delim("./icicle data/taxa_nifH_16s_L3.txt", row.names=1, check.names = FALSE)
L4 <- read.delim("./icicle data/taxa_nifH_16s_L4.txt", row.names=1, check.names = FALSE)
L5 <- read.delim("./icicle data/taxa_nifH_16s_L5.txt", row.names=1, check.names = FALSE)
f <- read.delim("./icicle data/FUN.txt", row.names=1)
2.3 生态功能与各微生物类群的相关性分析
r 复制代码
taxaList <- list(L2=L2,L3=L3,L4=L4,L5=L5)
corList <- list()
for(i in 1:length(taxaList)){
  cor <- corr.test(taxaList[[i]],f$s1)
  corr <- cor$r
  corr[cor$p>0.05] <- 0
  corList[[i]] <- corr
}
2.4 生成可视化需要的JSON文件
r 复制代码
taxa_df <- list()
split_string <- strsplit(colnames(taxaList[[length(taxaList)]]), ";")
for(i in 1:length(taxaList)){
  if(i == length(taxaList)){
    taxa_df[[i]] <- colnames(taxaList[[i]])
  }
  else{
    taxa_df[[i]] <- sapply(split_string,function(x){paste(x[1:(length(x) - length(taxaList)+i)], collapse = ";")})
  }
}
df <- data.frame(taxa_df)
listn <- list()
n <- length(df)
for(m in 1:n){
  list4 <- list()
  if(m==1){
    for (i in 1:nrow(df)){
      list4[[i]] <- list(name=df[i,n],value=replace_na(corList[[n-m+1]][i],0))
    }
    listn[[m]] <- list4
  }
  else{
    j=1
    df0 <- df[!duplicated(df[,n-m+2]),(n-m+1):(n-m+2)]
    for (i in 1:nrow(df0)){
      if (!duplicated(df0[,1])[i]){
        list0 <- list(name=df0[i,1],value=replace_na(corList[[n-m+1]][j],0),
                      children=listn[[m-1]][df0[,1] %in% df0[i,1]])
        list4[[j]] <- list0
        j=j+1
      }
    }
    listn[[m]] <- list4
  }
}
list1 <- list(list(name="Bacteria",children=listn[[n]]))
2.5 导出JSON文件
r 复制代码
json_string <- toJSON(list1, pretty = TRUE)
cat(json_string)
write(json_string,"./taxonomy.json")
Step3:将生成的JSON文件上传网页

打开网页:buildTreeCorrelation,选择并读取生成的JSON文件即可。

相关推荐
尘中客3 小时前
放弃 Echarts?前端直接渲染后端高精度 SVG 矢量图流的踩坑记录
前端·javascript·echarts·前端开发·svg矢量图·echarts避坑
2501_916007473 小时前
网站爬虫原理,基于浏览器点击行为还原可接口请求
前端·javascript·爬虫·ios·小程序·uni-app·iphone
Highcharts.js5 小时前
适合报表系统的可视化图表|Highcharts支持直接导出PNG和PDF
javascript·数据库·react.js·pdf
叫我一声阿雷吧5 小时前
JS 入门通关手册(35):执行上下文、调用栈与作用域链深度解析
javascript·作用域链·js进阶·执行上下文·调用栈·变量提升·闭包原理
Amumu121387 小时前
Js:正则表达式(一)
开发语言·javascript·正则表达式
月光宝盒造梦师9 小时前
Ant Design Ellipsis 中的判断逻辑 isEleEllipsis 方法非常消耗性能
javascript·react·优化
酉鬼女又兒10 小时前
零基础快速入门前端ES6 核心特性详解:Set 数据结构与对象增强写法(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·es6
阿珊和她的猫11 小时前
以用户为中心的前端性能指标解析
前端·javascript·css
叫我一声阿雷吧11 小时前
JS 入门通关手册(36):变量提升、暂时性死区与块级作用域
javascript·变量提升·暂时性死区·tdz·块级作用域· 前端面试
成都渲染101云渲染666611 小时前
跳出“硬件堆砌”陷阱|渲染101如何用技术重构云渲染的专业价值?
java·前端·javascript