批量可視化fastp輸出結(jié)果

  • fastp是一個(gè)非常方便的基因組數(shù)據(jù)處理軟件,之前在質(zhì)控的環(huán)節(jié)就有用到它。
  • 這個(gè)軟件比較方便的地方就是對(duì)于處理前后的數(shù)據(jù)情況會(huì)輸出一個(gè)可視化的網(wǎng)頁(yè)報(bào)告,可以直接查看,報(bào)告內(nèi)容也十分的簡(jiǎn)單易懂。
  • 對(duì)于單個(gè)數(shù)據(jù)或者少數(shù)數(shù)據(jù)直接這么查看是比較方便的,但是對(duì)于大批量的數(shù)據(jù)進(jìn)行處理以后,要還是一個(gè)一個(gè)報(bào)告查看,就讓人很抓狂了。
  • 最近就碰到了這么一個(gè)問(wèn)題,于是寫(xiě)了一個(gè)python小腳本,進(jìn)行批量結(jié)果的可視化,做一下筆記,怕以后忘了。

  • 要進(jìn)行批量可視化的前提是可視化的數(shù)據(jù),fastp在處理完數(shù)據(jù)后,除了一個(gè)網(wǎng)頁(yè)格式報(bào)告之外,還有一個(gè)json格式的報(bào)告,這就是我們的數(shù)據(jù)來(lái)源。
  • 本腳本使用python3.x的版本,設(shè)計(jì)第三方庫(kù)如下:
    • pandas
    • matplotlib
  • 首先為這個(gè)腳本新建一個(gè)目錄,并在目錄下新建一個(gè)report目錄(目錄名隨意)和一個(gè)python腳本(腳本名隨意),report目錄用來(lái)放fastp的json格式報(bào)告,如圖,我的目錄下面就放了兩百多份報(bào)告。

    目錄
  • 這個(gè)實(shí)現(xiàn)本身很簡(jiǎn)單,主要要考慮的一點(diǎn)是WGS數(shù)據(jù)很多時(shí)候不是一個(gè)sample一對(duì)fastq文件,很多時(shí)候一個(gè)sample對(duì)應(yīng)好多對(duì)fastq文件,那么fastp也會(huì)輸出多個(gè)報(bào)告,對(duì)于這些報(bào)告我們要進(jìn)行合并。
  • 下面就來(lái)解析一下腳本

先上完整腳本

import json, os
import pandas as pd
import matplotlib.pyplot as plt

result_list = os.listdir('./report')
result_dict = {}
merge_result_dict = {}
for i in result_list:
    if i.endswith('.json'):
        with open('./report/' + i, 'r') as f:
            result_dict[i] = json.load(f)
for k,v in result_dict.items():
    key = k.split('_')[0]
    merge_result_dict[key] = {'total_bases': v['summary']['before_filtering']['total_bases'] + merge_result_dict.get(key, {'total_bases': 0}).get('total_bases', 0),
    'q20_bases': v['summary']['before_filtering']['q20_bases'] + merge_result_dict.get(key, {'q20_bases': 0}).get('q20_bases', 0),
    'q30_bases': v['summary']['before_filtering']['q30_bases'] + merge_result_dict.get(key, {'q30_bases': 0}).get('q30_bases', 0),
    'total_reads': v['summary']['before_filtering']['total_reads']+ merge_result_dict.get(key, {'total_reads': 0}).get('total_reads', 0),
    'dup': v['summary']['before_filtering']['total_reads'] * v['duplication']['rate'] + merge_result_dict.get(key, {'dup': 0}).get('dup', 0)}

df_ = pd.DataFrame(merge_result_dict).T


#原始數(shù)據(jù)量
plt.figure(1)
plt.scatter(df_.index, df_.total_bases)
plt.xlabel("sample name")
plt.ylabel("total_bases")
plt.title("Raw date: total_bases")
plt.plot(df_.index, [9e+10 for i in range(df_.shape[0])], 'r')

#q20
plt.figure(2)
plt.scatter(df_.index, df_.q20_bases / df_.total_bases)
plt.xlabel("sample name")
plt.ylabel("q20 percent")
plt.title("Raw date: q20 content")

#q30
plt.figure(3)
plt.scatter(df_.index, df_.q30_bases / df_.total_bases)
plt.xlabel("sample name")
plt.ylabel("q30 percent")
plt.title("Raw date: q30 content")

#dup
plt.figure(4)
plt.scatter(df_.index, df_.dup / df_.total_reads)
plt.xlabel("sample name")
plt.ylabel("duplication rate")
plt.title("Raw date: duplication rate")

#cut dup
plt.figure(5)
plt.scatter(df_.index, (1 - df_.dup / df_.total_reads) * df_.total_bases)
plt.xlabel("sample name")
plt.ylabel("bases")
plt.title("cut dup: bases")

plt.show()
  1. 首先導(dǎo)入相應(yīng)的庫(kù),其中json和os是內(nèi)置庫(kù),分別用來(lái)解析json文件以及查看文件。json格式的解析很簡(jiǎn)單,其實(shí)json可以看成是python里面的字典,下面是簡(jiǎn)單的json庫(kù)使用:

    import json
    # 輸出 json 數(shù)據(jù)
    with open('data.json', 'w') as f:
        json.dump(data, f)
     
    # 讀取數(shù)據(jù)
    with open('data.json', 'r') as f:
        data = json.load(f)
    
  1. 一般情況下,在當(dāng)前目錄運(yùn)行的腳本,直接用相對(duì)路徑就行,但是也有可能你的報(bào)告不在當(dāng)前目錄下,那么第5行和第10行的'./report'就要改成你報(bào)告所在目錄的位置,同時(shí)report這個(gè)目錄名也要改成你自己存放json格式的目錄名。

  2. 如何合并一個(gè)sample的報(bào)告結(jié)果

    for k,v in result_dict.items():
     key = k.split('_')[0]
     ...
    

    這一步的工作就是合并結(jié)果,在我的結(jié)果里,雖然一個(gè)sample有時(shí)候會(huì)被分為好多個(gè)數(shù)據(jù),但是數(shù)據(jù)的前綴的一部分都是一樣的,且以_分割。

  3. 這個(gè)腳本提取了raw data中total_basesq30_bases的數(shù)據(jù),這是因?yàn)檫@一塊是需要和測(cè)序公司核對(duì)的部分,一般公司需要交付 90G 的raw data,且Q30要80%以上。其實(shí)fastp結(jié)果里還有很多其他可以提取的數(shù)據(jù),完全可以根據(jù)需要提取作圖,還是很簡(jiǎn)單的。

  4. 最后一個(gè)圖是看一下,如果去掉duplicate的數(shù)據(jù),那么raw data還有多少數(shù)據(jù)量。

  5. 展示一個(gè)結(jié)果圖。

total_bases
q20
q30
dup
filter
  • 腳本本身超級(jí)簡(jiǎn)單,我看半天實(shí)在也不知道還有哪里需要解釋的,如果有什么錯(cuò)誤或者寫(xiě)的不好的還請(qǐng)見(jiàn)諒了。


  • 水平有限,要是存在什么錯(cuò)誤請(qǐng)指出,可發(fā)送郵箱至shiyuant@outlook.com!請(qǐng)大家多多批評(píng)指正,相互交流,共同成長(zhǎng),謝謝?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容