统计fasta文件中序列的长度并绘制直方图

"""
对fa文件中的序列进行处理
# 获取序列的id和序列信息
# 统计每个id对应的序列的长度
# 对序列长度进行统计
# 绘制直方图
"""
import os
import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
import sys
def read_seq(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            if line.startswith('>'):
                seq_id.append(line.rstrip('\n').replace('>', ''))
            else:
                seq.append(line.rstrip('\n'))
    seq_dic = dict(zip(seq_id,seq))  # 将序列编号和序列信息两个列表合并成字典
    for v in seq_dic.values():
        seq_len.append(len(v))
    return seq_id , seq, seq_len


def write_count(seq_id, seq, seq_len):
    # pandas 写入序列编号、序列信息、序列长度
    data1 = pd.DataFrame({"Seq_ID": seq_id})
    data2 = pd.DataFrame({"Seq_Info": seq})
    data3 = pd.DataFrame({"Seq_Len": seq_len})

    writer = pd.ExcelWriter(abs_path + '\\' + "test1.xlsx") # windows 下使用
    data1.to_excel(writer,sheet_name="data",startcol=0,index=False)
    data2.to_excel(writer,sheet_name="data",startcol=1,index=False)
    data3.to_excel(writer,sheet_name="data",startcol=2,index=False)
    #writer.save()  # 数据保存为excel文件

def count_bar(seq_len):
    """
    # 根据上一步获得的序列长度信息,对其进行sort/uniq,matplotlib 处理并绘制直方图
    # 首先对数据进行排序统计对相同长度进行计数
    # 数据清洗后进行画bar图
    """
    len_count = Counter(seq_len)  # 提取上一步获得第三列长度数据进行清洗并统计每个长度的个数
    # matplotlib绘图
    x = []
    y = []
    for k ,v in len_count.items():
        x.append(k)
        y.append(v)
    print(x ,y)
    plt.bar(x,y)
    plt.xlabel("Sequence Length")
    plt.ylabel("Sequence Numbers")
    plt.show()

#def main():


if __name__ == "__main__":
    abs_path = os.getcwd()  # 获取当前目录路径
    print(abs_path)
    file_name = sys.argv[0]
    file_path = abs_path + '\\' + '*.fa'  # 获取当前目录下的文件信息 
    seq_id = []  # 新建列表存储fasta文件中序列编号信息
    seq = []  # 新建列表存储对应fasta文件中序列信息
    seq_len = []  # 新建列表存储对应序列的长度信息
    read_seq(file_path)
    write_count(seq_id, seq, seq_len)
    count_bar(seq_len)


  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值