본문 바로가기
컴퓨터관련 쪽지

[pandas, matplotlib] bed 파일을 읽어 들여서 모두 한번에 line plot 하기

by 프들이 2021. 3. 22.
반응형

코드

import pandas as pd
import matplotlib.pyplot as plt
import glob

def gen_readcnt_df(file_list):
    """ file_list: bed 파일에 대한 리스트
    bed file 형식:
    	chrname	시작	끝	영역내read의 갯수
    특별히 bed 에는 header 행은 없는 상태임
    """
    res = None
    for bed in file_list:
        colname = bed.split("/")[-1].split(".")[0]
        aa = pd.read_csv(bed, sep="\t", header=None, index_col=(0,1,2), names=("chrn","init","end",colname))
        if res is None:
            res = aa
        else:
            res = pd.merge(res, aa, how='inner',on=("chrn","init","end"))
    return res
    
def plot_all(df):
    """ 모든 염색체에 대해서 한꺼번에 플랏팅
    이미 chrn,init,end 가 column index 인 관계로 바로 dataframe.plot() 해주면 된다.
    샘플이 많아지면 label 이 너무 많아진다. label 을 화면에서 보이지 않게 하기 위해 set_visible 을 False 로 설정한다.
    """
    ax = df.plot(figsize=(30,10))
    ax.get_legend().set_visible(False)
    
def plot_xy_chromosome(df):
    """ 성염색체만 선별해서 찍는다. [] 로 묶어주는 것 유의. () 으로 하면 안 됨
    """
    ax = df.loc[["chrX", "chrY"]].plot(figsize=(30,10))
    ax.get_legend().set_visible(False)

def plot_a_chromosome(df, chrn):
    ax = df.loc[chrn].plot(figsize=(30,10))
    ax.get_legend().set_visible(False)

if __name__ == "__main__":
    bed_list = glob.glob("a/b/*.bed")
    my_df = gen_readcnt_df(bed_list)
    plot_all(my_df)
    

우선 해당 library 가 다 설치되어있다는 가정에서 시작해본다. 위 예에서처럼 하면 된다.

dataframe.plot 에서 라벨 없애기

pandas 는 pyplot.plot을 감싸서 plot을 구현해 놓았기 때문에 for 문을 쓰지 않고 쉽게 plot을 모든 column에 대해서 할 수 있다. 다만 이때 label 이 자동으로 그림에 표시가 되는데 이것이 결과물을 방해할 수가 있다. 다시 말해 pyplot에서 label 이 너무 많아지면 그림 범위를 벗어나버린다. 이럴 경우 pyplot의 결과를 받아서 set_visible(False)를 해주면 된다.

 

 

반응형

댓글