컴퓨터관련 쪽지
[pandas, matplotlib] bed 파일을 읽어 들여서 모두 한번에 line plot 하기
프들이
2021. 3. 22. 18:40
코드
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)를 해주면 된다.
반응형