-
[Seaborn, Plotly] 파이썬으로 Volcano plot 그려보기Python/시각화 2023. 6. 12. 10:14반응형
파이썬으로 Volcano plot 그려보기
파이썬(Python)은 다양한 분야에서 사용되는 프로그래밍 언어인데, 특히 생물정보학(Bioinformatics)에는 다른 프로그래밍 언어에 비해서 점유율이 높은 편입니다. 그래서, 간혹 시각화 패키지를 살펴보면 생물정보학에 특화된 기능이 몇 가지씩 보이고는 하지요. 이번에는 그중에서 화산 플롯(Volcano plot)을 그려보는 방법을 알아보도록 하겠습니다.
Volcano plot은 x축에 효과 크기(Effect size)를 두고, y축으로는 p-value를 놓는 산점도(scatterplot)의 일종입니다. 이름이 생소할지 몰라도 기본은 산점도이기 때문에 여느 시각화 패키지를 이용해서 scatterplot 함수를 이용해 손쉽게 구현할 수 있지요.
Volcano plot의 장점은, Effect size와 p-value 2가지 요소 중 특정 값을 컷오프(cutoff)로 두고, 두 조건을 모두 만족하는 대상을 손쉽게 확인해볼 수 있다는 점입니다. 이러한 특징을 이용해서, Bioinformatics에서는 발현값이 서로 타이나는 유전자(DEGs, Differentially Expressed Genes)의 결과를 시각화하는 용도로 이용합니다. 물론, 다른 분야에서도 컷오프가 두 가지인 대상을 시각화하는데 효과적으로 이용할 수 있습니다.
하지만 파이썬에서는 Volcano plot을 공식 지원하는 패키지는 별로 없는 상황이라 대부분의 유저들은 다른 프로그래밍 언어인 R을 이용하거나, scatterplot을 이용해서 표현하는 편입니다. 우선, scatterplot을 활용한 방법을 알아보겠습니다. 해당 시각화에서는 시본(seaborn)을 활용했습니다.
import pandas as pd import dash_bio import seaborn as sns import matplotlib.pyplot as plt import math df = pd.read_csv('https://raw.githubusercontent.com/plotly/dash-bio-docs-files/master/volcano_data1.csv') df.head()
CHR BP P SNP ZSCORE EFFECTSIZE GENE DISTANCE 0 1 937641 0.335344 rs9697358 0.9634 -0.0946 ISG15 1068 1 1 1136887 0.245857 rs34945898 1.1605 -0.0947 TNFRSF4 0 2 1 2116240 0.823286 rs12034613 0.2233 -0.0741 FP7162 0 3 1 2310562 0.493204 rs4648633 0.6852 0.0146 MORN1 0 4 1 2681715 0.605392 rs4430271 0.5167 0.1234 MMEL1 127427 위와 같은 데이터를 이용해서 Volcano plot 시각화를 시도해볼 수 있습니다. 저는 파이썬 시각화 패키지 중 하나인 플로틀리(plotly)에서 제공하는 자료를 이용했지만, DEG 분석 툴에 따라서 다른 양식으로 데이터가 들어올 수 있으므로 주의해 주세요.
이 시각화에서는 p-value 컷오프를 0.05로, Effect size의 컷오프를 |1|로 설정했습니다. 이는 분석 목적이나 보정 방법에 따라서 유동적으로 변할 수 있기 때문에 통계적으로 검토 후 조절해 주시기 바랍니다.
def classification(x): if x.loc['P'] < 0.05: if x.loc['EFFECTSIZE'] > 1: return 'positive' elif x.loc['EFFECTSIZE'] < -1: return 'negative' return 'etc' df['log10P'] = df['P'].apply(lambda x: math.log10(x)*(-1)) df['type'] = df.T.apply(lambda x: classification(x))
f1 = sns.scatterplot(data=df, x='EFFECTSIZE', y='log10P', marker='+', hue='type', palette = {'negative':'green', 'positive':'red', 'etc':'gray'}, legend = False) f1.vlines (1, -1, 15, colors = 'black', linestyles='--') f1.vlines (-1, -1, 15, colors = 'black', linestyles='--') f1.hlines (-(math.log10(0.05)), -20, 20, colors = 'black', linestyles='--') f1.set_xlim(-2,2.8) f1.set_ylim(0, 8.8) plt.xlabel('EFFECT SIZE') plt.ylabel('${-log_{10}}$ P-value')
이와 비슷한 Volcano plot 시각화는 plotly에서 제공하는 dash_bio 패키지를 이용할 경우 조금 더 손쉽게 시각화를 하는건 물론, 인터렉티브 플롯(interactive plot) 형식으로 살펴볼 수 있습니다. 다만, 위에서 소개해 드린 방식에 비해서 세세한 스타일 또는 컷오프 조절이 어려우니 취향 또는 목적에 맞게 골라 보시면 되겠습니다.
dash_bio.VolcanoPlot( dataframe=df, )
반응형'Python > 시각화' 카테고리의 다른 글
[Matplotlib] 파이썬으로 방사형 차트(Radar chart) 그리는 방법 (0) 2023.07.31 [Folium] 파이썬 Folium을 이용해서 마커를 찍는 방법 (0) 2023.06.09 [Seaborn] 파이썬 씨본을 이용한 히트맵 시각화 해보기 (0) 2023.06.07