批量可视化fastp输出结果

2019-07-21  本文已影响0人  十三而舍

先上完整脚本

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


#原始数据量
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. 首先导入相应的库,其中json和os是内置库,分别用来解析json文件以及查看文件。json格式的解析很简单,其实json可以看成是python里面的字典,下面是简单的json库使用:

    import json
    # 输出 json 数据
    with open('data.json', 'w') as f:
        json.dump(data, f)
     
    # 读取数据
    with open('data.json', 'r') as f:
        data = json.load(f)
    
  1. 一般情况下,在当前目录运行的脚本,直接用相对路径就行,但是也有可能你的报告不在当前目录下,那么第5行和第10行的'./report'就要改成你报告所在目录的位置,同时report这个目录名也要改成你自己存放json格式的目录名。

  2. 如何合并一个sample的报告结果

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

    这一步的工作就是合并结果,在我的结果里,虽然一个sample有时候会被分为好多个数据,但是数据的前缀的一部分都是一样的,且以_分割。

  3. 这个脚本提取了raw data中total_basesq30_bases的数据,这是因为这一块是需要和测序公司核对的部分,一般公司需要交付 90G 的raw data,且Q30要80%以上。其实fastp结果里还有很多其他可以提取的数据,完全可以根据需要提取作图,还是很简单的。

  4. 最后一个图是看一下,如果去掉duplicate的数据,那么raw data还有多少数据量。

  5. 展示一个结果图。

total_bases q20 q30 dup filter
上一篇下一篇

猜你喜欢

热点阅读