Kodomo

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

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

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

Часто возникает нобходимость посмотреть глазами на ваши данные, например, построив график. А данных этих может быть так много, что какой-нибудь Excel просто повиснет и не закончит их обсчитывать никогда, при том, что Python обсчитает их за пару минут. Было бы здорово иметь возможность строить графики прямо в Python'е - и такая возможность есть. Для этого есть пакет matplotlib (подробная документация находится по адресу http://matplotlib.org/contents.html), который умеет строить почти любые графики, какие вы можете захотеть построить.

* если вы захотите установить matplotlib себе, то имейте в виду, что он требует также пакеты numpy и scipy

Для начала работы с графиками необходимо импортировать набор функции из пакета matplotlib:

   1 import matplotlib.pyplot as plt

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

   1 import matplotlib.pyplot as plt
   2 x=[0.1,0.2,0.4,0.5,0.7]
   3 y=[1,4,9,2,6]
   4 plt.plot(x,y,'b-')
   5 plt.show()

Параметр 'b-' задает тип графика - цвет (blue) и тип соединяющей линии ("-" - сплошная).

Самые частые графики

Два основных типа графиков, которые приходится строить очень часто - это двухмерный поточечный график, где каждая точка лежит отдельно и не соединена с другими (scatter plot) и гистограмма.

1) Поточечный график:

Для его построения можно задать другой тип для маркера в вызове plot(), например "o":

   1 import matplotlib.pyplot as plt
   2 import random
   3 random.seed()
   4 x=list()
   5 y=list()
   6 # Creating two subsets of data
   7 for i in range(1,200):
   8         x.append(random.gauss(0,1))
   9         y.append(random.gauss(0,1))
  10 
  11 for i in range(1,200):
  12         x.append(random.gauss(8,1))
  13         y.append(random.gauss(0,1))
  14 
  15 plt.plot(x,y,'ro')
  16 plt.show()

Также для поточечных графиков есть отдельная функция scatter(), см. ниже.

2) Гистограмма:

Гистограмма - это такой вид графика, который отображает, как много тех или иных объектов имеется в ваших данных. Для него в matplotlib есть функция hist():

   1 plt.hist(x, bins=20)
   2 # Data will be aggregated in 20 bins, compare to:
   3 # plt.hist(x, bins=50)

Отображение вспомогательной информации на графике

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

   1 def generate_data():
   2         x=list()
   3         y=list()
   4         # Creating two subsets of data
   5         for i in range(1,200):
   6                 x.append(random.gauss(0,1))
   7                 y.append(random.gauss(0,1))
   8         for i in range(1,200):
   9                 x.append(random.gauss(8,1))
  10                 y.append(random.gauss(2,1))
  11 
  12         return x, y
  13 
  14 import matplotlib.pyplot as plt
  15 import random
  16 random.seed()
  17 x, y = generate_data()
  18 plt.plot(x, y, 'ro', label = 'GC data')
  19 plt.title('GC content')
  20 plt.xlabel('Normalized GC content')
  21 plt.ylabel('Normalized temperature')
  22 x_min = -5
  23 x_mean = 5
  24 x_max = 15
  25 y_min = -3
  26 y_mean = 2
  27 y_max = 7
  28 plt.axis( [x_min, x_max, y_min, y_max] ) # Set axis limits
  29 plt.text( x_mean - 2, y_mean, 'Split valley', fontsize=12 ) # Add text 'Split valley' to graph at point (3,0)
  30 plt.grid(True) # Turn on grid
  31 plt.legend() # Place legend with text according to 'label' parameter of .plot()
  32 plt.show()

scatter()

Как уже говорилось выше, для построения поточечного графика scatter plot в matplotlib есть отдельная функция scatter():

   1 x, y = generate_data()
   2 
   3 plt.plot(x, y, 'r^', markersize=5)
   4 # Compare
   5 plt.scatter(x, y, c='r', marker='^', s=25)

Передача параметров массивами

Если вы хотите, чтобы точки выглядели на графике по разному, то у вас есть два варианта действий. Первый - передать больше одного графика на построение. Второй - некоторые из функций matplotlib (см. документацию) позволяют задать свойства (такие, как цвет, размер, форма точки) не для всех точек сразу, а для каждой отдельно. Ниже приведен пример, использующий оба способа:

   1 random.seed()
   2 x, y = generate_data()
   3 sizes = []
   4 for i in xrange(400): # 400 is length of x and y
   5        s = random.gauss(100,35)
   6        if s <= 0:
   7               s = 1
   8        sizes.append(s)
   9 
  10 # Pass sizes as list, not single value for all points, compare to:
  11 # plt.scatter(x[:200], y[:200], s = 100, c = 'g', marker = 'v')
  12 plt.scatter(x[:200], y[:200], s = sizes[:200], c = 'g', marker = 'v')
  13 # Plot second plot on the same graph
  14 plt.scatter(x[200:], y[200:], s = sizes[200:], c = 'r', marker = '1')
  15 plt.title('GC content')
  16 plt.xlabel('Normalized GC content')
  17 plt.ylabel('Normalized temperature')
  18 plt.axis( [-5, 15, -3, 7] )
  19 plt.text( 3, 2, 'Split valley', fontsize=12 )
  20 plt.show()

Сохранить картинку в файл

Чтобы сохранить получившийся график в файл можно использовать кнопку сохранения в интерактивном окне, появляющемся после вызова plt.show(). Если вы хотите сохранять файл аытоматияески, без просмотра, используйте метод savefig():

   1 plt.savefig('picture') # creates 'picture.png'

Если вы будете задавать свои форматы, то знайте, что самый правильный формат для графиков - svg, но скорее всего он не откроется у ваших научных руководителей. Так что можете использовать png - отличный формат. Главное помните - никогда не используйте jpg - он размывает резкие контуры, поэтому годится для фото, но не для графиков.