2016-05-26 94 views
8

残念ながら、自分で解決策を見つけられませんでした。 PythonでManhattan plotを作成するにはどうすればいいですか?たとえば、matplotlib/pandasを使用します。問題は、これらのプロットではx軸が離散的であることです。pythonでmatplotlibを使ってマンハッタンプロットを作成する方法は?

from pandas import DataFrame 
from scipy.stats import uniform 
from scipy.stats import randint 
import numpy as np 

# some sample data 
df = DataFrame({'gene' : ['gene-%i' % i for i in np.arange(1000)], 
'pvalue' : uniform.rvs(size=1000), 
'chromosome' : ['ch-%i' % i for i in randint.rvs(0,12,size=1000)]}) 

# -log_10(pvalue) 
df['minuslog10pvalue'] = -np.log10(df.pvalue) 
df = df.sort_values('chromosome') 

# How to plot gene vs. -log10(pvalue) and colour it by chromosome? 
+0

あなただけの賢明な数値データではなく、文字列をプロットすることができます。 x-dataはどのように見えますか? –

+0

マンハッタンのプロットは遺伝学において非常に一般的であり、実際にはかなり賢明です。 x-データはSNP名の名前(はい、文字列)です。 (例では遺伝子ではなくx-データSNPを呼び出すべきであろうか) –

+0

私はthazt Manhattanプロットが賢明ではないとは言わなかったが、文字列と数字のデータを有意義にプロットすることは部分的には不可能だと言った。あなたは何とかあなたの名前を数字に変換するか、単にそのインデックスを使用する必要があります。私は下の答えとして人工データを使った小さな例を提供します。 –

答えて

8

あなたはこのようなものを使用することができます:私はちょうどXの位置をラベルに制御を持っているために、インデックスを実行しているの余分な列を作成し

from pandas import DataFrame 
from scipy.stats import uniform 
from scipy.stats import randint 
import numpy as np 
import matplotlib.pyplot as plt 

# some sample data 
df = DataFrame({'gene' : ['gene-%i' % i for i in np.arange(10000)], 
'pvalue' : uniform.rvs(size=10000), 
'chromosome' : ['ch-%i' % i for i in randint.rvs(0,12,size=10000)]}) 

# -log_10(pvalue) 
df['minuslog10pvalue'] = -np.log10(df.pvalue) 
df.chromosome = df.chromosome.astype('category') 
df.chromosome = df.chromosome.cat.set_categories(['ch-%i' % i for i in range(12)], ordered=True) 
df = df.sort_values('chromosome') 

# How to plot gene vs. -log10(pvalue) and colour it by chromosome? 
df['ind'] = range(len(df)) 
df_grouped = df.groupby(('chromosome')) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
colors = ['red','green','blue', 'yellow'] 
x_labels = [] 
x_labels_pos = [] 
for num, (name, group) in enumerate(df_grouped): 
    group.plot(kind='scatter', x='ind', y='minuslog10pvalue',color=colors[num % len(colors)], ax=ax) 
    x_labels.append(name) 
    x_labels_pos.append((group['ind'].iloc[-1] - (group['ind'].iloc[-1] - group['ind'].iloc[0])/2)) 
ax.set_xticks(x_labels_pos) 
ax.set_xticklabels(x_labels) 
ax.set_xlim([0, len(df)]) 
ax.set_ylim([0, 3.5]) 
ax.set_xlabel('Chromosome') 

を。

enter image description here

+0

私は染色体で値をソートする直前に次の2行を追加しました: 'df.chromosome = df.chromosome.astype(' category '); df.chromosome = df.chromosome.cat.set_categories(['ch-%i' iは範囲(12)内にあり、ordered = True) 'です。これにより、x軸上の染色体の正しい順序が与えられ、染色体XとY(例ではない)が最後に出現することが可能になります。たぶんあなたの例を更新できますか?ありがとう! –

+0

これは、x値があなたが各遺伝子モデルに割り当てるインデックス(+ 1に答えています)ですが、x値が実際に整数で表されるゲノム座標のセットの場合はどうでしょうか?この場合、整数がインデックスでの例のように順次または一意であるという保証はありません。インデックスをゲノム座標に置き換えると、すべての染色体が並べて配置されるのではなくオーバーレイされます。 – Malonge

7
import matplotlib.pyplot als plt 
from numpy.random import randn, random_sample 

g = random_sample(int(1e5))*10 # uniform random values between 0 and 10 
p = abs(randn(int(1e5))) # abs of normally distributed data 

""" 
plot g vs p in groups with different colors 
colors are cycled automatically by matplotlib 
use another colormap or define own colors for a different cycle 
""" 
for i in range(1,11): 
    plt.plot(g[abs(g-i)<1], p[abs(g-i)<1], ls='', marker='.') 

plt.show() 

Example of a manhattan style plot

また、あなたの問題に完成したソリューションを提供するために思われる、this scriptをチェックアウトすることができます。

+0

ニース!私はループ内でプロット関数を呼び出すことはまだ新しいです。ちょうどそれを考えなかったでしょう。各色の列の下に、尊敬される染色体の名前をどのように追加しますか?各列の長さはそれぞれ異なるため、各列の幅は異なります。 wikipediaのページ(https://upload.wikimedia.org/wikipedia/commons/1/12/Manhattan_Plot.png)の例を参照してください。 –

+0

matplotlibでは、xaxisのラベルプロパティを設定したり、数値ラベルの代わりに独自の文字列を指定して印刷することもできます。 待ってください。あなたは本当に遺伝子ではなく、染色体対pvalueをプロットする必要があります。しかし、コアーは基本的には染色体番号でもあります。遺伝子番号はどこに入っていますか? –

+0

私がまだ理解していないことは、染色体データがxaxis上にどのように分布しているのかということです。 –

関連する問題