Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2012

Визуализация данных средствами Python.

Самый наглядный способ анализировать данные – тем или иным способом их нарисовать и посмотреть что получилось. Для этого в Python есть пакет matplotlib (документация находится по адресу http://matplotlib.org/contents.html, который содержит много различных видов графиков. Для начала работы с графиками необходимо импортировать набор функции из пакета matplotlib:

   1 import matplotlib.pyplot as plt

plt.plot(x,y) – рисуем набор точек (x,y). В нашем случае x, y – два числовых списка одинаковой длины, по умолчанию соседние точки списка соединены линией. plt.show() – показать объект. Простейший график:

   1 import matplotlib.pyplot as plt
   2 y=[1,4,9,2,6]
   3 plt.plot(y)
   4 plt.show()

Случайное блуждание:

   1 import matplotlib.pyplot as plt
   2 import argparse, sys, random, math
   3 
   4 parser=argparse.ArgumentParser()
   5 parser.add_argument('-n', dest='n', type=int, default=100)
   6 parser.add_argument('--sigma', dest='sigma', type=float, default=1)
   7 options=parser.parse_args()
   8 
   9 x=list()
  10 y=list()
  11 value=0
  12 for i in range(1,options.n):
  13         value=value+random.gauss(0,options.sigma)
  14         x.append(i)
  15         y.append(value)
  16         
  17 plt.plot(x,y)
  18 plt.show()

К графику можно добавить информацию, например подпись осей, название графика, текст, изменить область осей и многое другое. Добавим к нашему пример:

   1 plt.plot(x,y,linewidth=1,color=[random.random(),random.random(),random.random()])
   2 plt.xlabel("step")
   3 plt.ylabel("value")
   4 plt.title("Brownian motion")
   5 boundary=2*options.sigma*math.sqrt(options.n)
   6 plt.axis( [1,options.n,-boundary,boundary] )
   7 plt.text(options.n/2, boundary/2, "sigma: "+str(options.sigma))
   8 plt.grid()
   9 plt.show()

Также можно менять тип линий, цвет, толщину и т.д. Добавим к нашему примеру много разных линий разного цвета с помощью параметра color.

   1 import matplotlib.pyplot as plt
   2 import argparse, sys, random, math
   3 
   4 parser=argparse.ArgumentParser()
   5 parser.add_argument('-n', dest='n', type=int, default=100)
   6 parser.add_argument('--sigma', dest='sigma', type=float, default=1)
   7 parser.add_argument('--runs', dest='runs', type=int, default=1)
   8 
   9 options=parser.parse_args()
  10 
  11 for j in range(0,options.runs):
  12         x=list()
  13         y=list()
  14         value=0
  15         for i in range(1,options.n):
  16                 value=value+random.gauss(0,options.sigma)
  17                 x.append(i)
  18                 y.append(value) 
  19         plt.plot(x,y,linewidth=1,color=[random.random(),random.random(),random.random()],label=str(j))
  20 plt.xlabel("step")
  21 plt.ylabel("value")
  22 plt.title("Brownian motion")
  23 boundary=4*options.sigma*math.sqrt(options.n)
  24 plt.axis( [1,options.n,-boundary,boundary] )
  25 plt.text(options.n/2, boundary/2, "sigma: "+str(options.sigma))
  26 plt.grid()
  27 plt.legend(fontsize=8,loc="best")
  28 plt.show() 

Scatter plot изображает набор точек на плоскости. Например, для каждого участка генома длинной 50000 нк запишем два числа – скорость мутирования этого участка и время его репликации. Тогда функция scatter(…) построит scatter plot:

   1 import matplotlib.pyplot as plt
   2 import math
   3 
   4 fin=open("mutation.txt","r")
   5 rate=list()
   6 timing=list()
   7 gc_state=list()
   8 for line in fin:
   9         elements=line.split(' ')
  10         rate.append( float(elements[0]) )
  11         timing.append( float(elements[1]) )
  12         gc_state.append( elements[2] )
  13 plt.scatter(timing,rate,s=1)
  14 plt.xlabel("replication timing")
  15 plt.ylabel("mutation rate")
  16 plt.title("mutation rate is lined to replication timing")
  17 plt.ylim((0.002,0.01))
  18 plt.show()

Можно изменять размер, вид и цвет точек. У каждого участка генома дополнительно рассмотрим его GC-состав (классифицируем его на низкий, средний и высокий) и раскрасим точки в соответствии с GC-составом:

   1 import matplotlib.pyplot as plt
   2 import math
   3 fin=open("mutation.txt","r")
   4 rate=list()
   5 timing=list()
   6 gc_state=list()
   7 mp={ "low": "red", "medium": "white", "high": "green" }  
   8 col=list()
   9 for line in fin:
  10         elements=line.split()
  11         rate.append( float(elements[0]) )
  12         timing.append( float(elements[1]) )
  13         gc_state.append( elements[2] )
  14         col.append( mp[elements[2]] )
  15 plt.scatter(timing,rate,s=30,c=col)
  16 plt.xlabel("replication timing")
  17 plt.ylabel("mutation rate")
  18 plt.title("mutation rate is lined to replication timing")
  19 plt.ylim((0.002,0.01))
  20 plt.show()

Другой полезный класс графиков – гистограмма. Представим, что нам дан набор последовательностей в fasta формате, какие характерные длины у этих последовательностей? Для этого используется функция hist(…):

   1 plt.hist(sizes, bins=20)