2016-05-26 9 views
8

दुर्भाग्य से, मुझे स्वयं कोई समाधान नहीं मिला है। मैं पाइथन के अंदर Manhattan plot कैसे बना सकता हूं, उदाहरण के लिए, matplotlib/pandas। समस्या यह है कि इन भूखंडों में एक्स-अक्ष अलग है।पायथन में 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

आप केवल समझदारी से संख्यात्मक डेटा, नहीं तार प्लॉट कर सकते हैं। एक्स-डेटा वास्तव में कैसा दिखता है? –

+0

मैनहट्टन भूखंड आनुवंशिकी में बहुत आम हैं और वे वास्तव में काफी समझदार हैं - या 'जेनेटिकिस्ट्स के लिए जानकारीपूर्ण' कहें। एक्स-डेटा एसएनपी-नामों के नाम (हां, तार) हैं। (शायद मुझे उदाहरण में जीन की बजाय एक्स-डेटा एसएनपी कहा जाना चाहिए था।) –

+0

मैंने यह नहीं कहा था कि मैनहट्टन प्लॉट समझदार नहीं हैं, मैंने कहा कि यह अर्थपूर्ण रूप से स्ट्रिंग बनाम संख्यात्मक डेटा प्लॉट करने के लिए आंशिक रूप से असंभव है। आपको किसी भी तरह से अपने नामों को संख्याओं में परिवर्तित करना होगा, या बस अपनी अनुक्रमणिका का उपयोग करना होगा। मैं नीचे दिए गए उत्तर के रूप में कलात्मक डेटा का उपयोग करके एक छोटा सा उदाहरण प्रदान करूंगा। –

उत्तर

8

आप कुछ इस तरह का उपयोग कर सकते हैं:

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

मैंने क्रोमोसोम द्वारा मानों को क्रमबद्ध करने से पहले निम्नलिखित दो पंक्तियां जोड़ दी हैं: 'df.chromosome = df.chromosome.astype (' category '); df.chromosome = df.chromosome.cat.set_categories (['ch-% i'% i i श्रेणी में (12)], आदेश दिया गया = सही) '। यह एक्स-अक्ष पर गुणसूत्रों का सही क्रम देगा और यह संभव बनाता है कि क्रोमोसोम एक्स और वाई (उदाहरण में नहीं) अंत में दिखाई देते हैं। शायद आप अपना उदाहरण अपडेट कर सकते हैं? धन्यवाद! –

+0

यह तब अच्छा काम करता है जब एक्स मान वह इंडेक्स होता है जिसे आप प्रत्येक जीन मॉडल (जो प्रश्न को +1 का उत्तर देते हैं) को असाइन करते हैं, लेकिन जब आपका एक्स मान वास्तव में पूर्णांक के रूप में प्रतिनिधित्व जीनोमिक निर्देशांक का एक सेट होता है। इस मामले में, इस बात की कोई गारंटी नहीं है कि पूर्णांक अनुक्रमिक या अद्वितीय होंगे क्योंकि वे इंडेक्स के साथ आपके उदाहरण में हैं। जब मैं जीनोमिक निर्देशांक के साथ इंडेक्स को प्रतिस्थापित करता हूं, तो मेरे सभी गुणसूत्रों को तरफ से रखे जाने के बजाए ओवरले किया जाता है। – 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

अच्छा! मैं अभी भी एक लूप के भीतर साजिश समारोह बुलावा करने के लिए नया हूँ। बस इसके बारे में सोचा नहीं होगा। आप प्रत्येक रंगीन कॉलम के नीचे सम्मानित गुणसूत्र के नाम को कैसे जोड़ देंगे? प्रत्येक कॉलम अलग चौड़ाई का है, क्योंकि प्रत्येक गुणसूत्र अलग-अलग लंबाई का होता है। विकिपीडिया पेज (https://upload.wikimedia.org/wikipedia/commons/1/12/Manhattan_Plot.png) पर उदाहरण देखें। –

+0

matplotlib में आप xaxis के लिए लेबल गुण सेट कर सकते हैं, और यहां तक ​​कि संख्यात्मक लेबल के बजाय प्रिंट करने के लिए अपने स्वयं के तार भी प्रदान कर सकते हैं ... रुको, अब मैं समझता हूं। आप वास्तव में गुणसूत्र बनाम pvalue प्लॉट करना चाहते हैं, और जीन नहीं। लेकिन कोर मूल रूप से केवल गुणसूत्र संख्या है। जीन संख्या कहां आती है? –

+0

जो भी मुझे अभी भी समझ में नहीं आता है यह है कि गुणसूत्र डेटा xaxis पर वितरित किया जाना चाहिए, क्योंकि यह आपके जैसा है, अलग है। –

संबंधित मुद्दे