От данных к красивым графикам с NetworkX

Данные белкового взаимодействия невероятно важны. Он описывает взаимодействие между биомолекулами, кодируемыми генами. Это позволяет нам понять сложности клеточной функции и даже предсказать потенциальные терапевтические методы. Существует множество баз данных, содержащих данные о взаимодействии белков, но STRING - одна из лучших. На момент написания он содержит 3,123,056,667 всего взаимодействий. В этих взаимодействиях участвует более 20 000 000 белков в более чем 5 000 организмов, которые соединяются и образуются. В этой статье я покажу вам, как загружать данные о взаимодействии белков из STRING API и как создавать графики и визуализации этих данных с помощью NetworkX.

### The required libraries and packages ###
import networkx as nx
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

Сбор и подготовка данных

Наш набор данных будет содержать попарные взаимодействия нескольких белков, которые участвуют в путях серотонина. Эти взаимодействия можно найти в STRING несколькими способами. Мы могли бы зайти на сайт STRING со списком белков и использовать поиск по множеству белков, но здесь мы хотим делать все с помощью Python. Библиотека запросов позволяет нам легко использовать HTTP-запросы для сбора данных. Документация STRING подробно описывает использование REST API и содержит множество примеров, но основной вызов для сбора сетевой информации для нескольких белков выглядит так:

https://string-db.org/api/[output-format]/network?identifiers=[your_identifiers]&[optional_parameters]

Подробности о формате вывода, идентификаторах и дополнительных параметрах можно найти в документации. Мы будем использовать выходной формат tsv (значения, разделенные табуляцией), список идентификаторов белков, разделенных% 0d, и один необязательный параметр: разновидности. Код для преобразования списка белков в правильный URL-адрес показан ниже.

Список белков был выбран из более широкого набора белков человека, относящихся к серотонину. Следует отметить наличие необязательного параметра &species=9606. 9606 - это видовой номер человека. Вы можете выбрать разные виды с помощью поиска организмов. Затем данные можно преобразовать в фрейм данных pandas, который будет использоваться для создания сети.

Создание сети

NetworkX включает несколько классов графов. В этом случае мы построим неориентированный, взвешенный график. График неориентированный, потому что взаимодействие между белком А и белком В такое же, как взаимодействие между белком В и белком А. График взвешен, потому что края будут иметь веса, основанные на оценке взаимодействия.

Фрейм данных interactions имеет одну строку для каждого взаимодействия, которая содержит два взаимодействующих белка и оценку взаимодействия. В следующем коде показано, как эти данные можно использовать для построения графика с помощью NetworkX. Каждый узел представляет собой белок, каждое ребро представляет собой взаимодействие между двумя белками, и каждое ребро оценивается по шкале.

Вот основная информация о графике с использованием nx.info(G):

Name: Protein Interaction Graph
Type: Graph
Number of nodes: 20
Number of edges: 128
Average degree:  12.8000

Граф содержит 20 узлов (белков) со 128 ребрами (взаимодействиями). Степень узла - это количество ребер, соединенных с этим узлом. На этом графике средняя степень составляет 12,8. Мы можем создать простую визуализацию этого графика, используя следующий код. Обратите внимание на использование nx.spring_layout, который является одним из алгоритмов позиционирования узла NetworkX.

Простую визуализацию, показанную выше, можно улучшить, добавив больше информации о графике. Я уже упоминал степень, то есть количество ребер, соединенных с узлом. Еще один показатель, который мы можем включить, - это центральность промежуточности. Каждая пара узлов в графе соединена одним кратчайшим путем. В невзвешенном графе кратчайший путь состоит из наименьшего набора ребер, соединяющих два узла. В взвешенном графе, как здесь, кратчайший путь состоит из набора ребер с наименьшей суммой весов. Центральность промежуточности данного узла - это мера количества кратчайших путей, которые проходят через этот узел, из всех кратчайших. Следующий код использует степень и промежуточность центральности каждого узла для определения его цвета и размера и использует веса ребер для определения цвета и размера ребер.

Мы можем использовать эти сопоставления цветов для создания улучшенной визуализации с помощью этого кода:

На этом графике отображается намного больше информации. Цветовая гамма варьируется от темно-фиолетового до ярко-желтого. Чем желтеет узел, тем выше степень. Чем больше узел, тем выше центральность промежуточности. Чем желтее и шире край, тем выше оценка взаимодействия.

Еще одна полезная визуализация - это минимальное остовное дерево, которое представляет собой подмножество ребер, которые соединяют все узлы с наименьшим возможным весом:

Исследования в области визуализации данных неоднократно показывали, что люди особенно хорошо умеют находить закономерности в визуальных данных. Чтобы понять график требуется меньше времени и меньше умственных способностей, чем для сбора той же информации из таблицы. Визуализации, подобные описанным здесь, являются отличным инструментом для изучения и демонстрации любых сетевых данных. Надеюсь, вам понравился этот урок и вы узнали несколько полезных приемов, которые вы можете использовать в своих собственных проектах!