반응형
코드
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)를 해주면 된다.
반응형
'컴퓨터관련 쪽지' 카테고리의 다른 글
pytest 에서 code coverage 사용: 얼만큼 코드에 대해서 테스트를 하는가 확인. (0) | 2021.03.25 |
---|---|
pytest 사용시 PYTHONPATH=. 설정 방법 (0) | 2021.03.25 |
vscode 에서 pylint 사용 (0) | 2021.03.24 |
yahoo mail 을 outlook 에 연결하기 (임시 비밀번호 생성) (0) | 2021.03.24 |
[Azure, jupyter] Azure 클라우드에서 jupyter 서버열고 외부에서 접속하는 방법 (0) | 2021.03.22 |
댓글