Графики вулканов - один из первых и наиболее важных графиков, которые нужно строить для анализа набора данных omics. Построив диаграмму рассеяния -log10 (скорректированное значение p) против значений log2 (кратное изменение), пользователи могут быстро визуализировать распределение и идентичность генов или белков, которые экспрессируются наиболее дифференциально.
Гены с наибольшими кратными изменениями и значительными p-значениями также являются идеальными мишенями для валидации и неизменно демонстрируют высокую воспроизводимость на различных платформах (Leiming Shi et al., BMC Bioinformatics, 2008).
Сюжет вулкана состоит из двух этапов:
- Во-первых, log2 кратное изменение (log2FC) определяется путем взятия отношения изобилия гена в экспериментальной группе к контрольной группе с последующим преобразованием log2 для получения нормального или почти нормального распределения. Значения ›0 рассматриваются как гены с повышенной регуляцией, а значения‹ 0 - с пониженной регуляцией.
- Во-вторых, скорректированное значение p (или q-значение), скорректированное с учетом множественных поправок, используется для расчета, если изменения экспрессии гена между экспериментальной и контрольной группами значительно различаются. Затем следует преобразование -log10 для получения -log10 (скорректированное значение p).
Чтобы проиллюстрировать, как строить графики вулканов с помощью Python, мы проанализируем набор данных транскриптомики, опубликованный Zak et al., PNAS, 2012. В этом исследовании серонегативным и серопозитивным субъектам вводили вакцину MRKAd5 / ВИЧ, а транскриптомные ответы в мононуклеарных клетках периферической крови (PBMC) измеряли через 6 часов, 1 день, 3 дня и 7 дней после вакцинации.
Со своей стороны, я обработал и скомпилировал кратное изменение, соотношение, p-значения и скорректированные p-значения (q-значения) серонегативных субъектов относительно времени = 0, используя Partek Genomics Suite, и обработанные данные доступны в GitHub.
Я настоятельно рекомендую использовать JupyterLab или Jupyter Notebook, которые представляют собой интерактивную веб-среду разработки для хранения и выполнения кодов Python. Вы можете посетить здесь для получения конкретных инструкций о том, как вы можете установить их на свой компьютер.
Сначала мы загружаем необходимые пакеты (pandas, NumPy и Plotly), чтобы построить график нашего вулкана с помощью Python. Обратите внимание, что вам нужно будет загрузить пакеты, прежде чем вы сможете начать их использовать.
Я решил использовать графическую библиотеку Plotly для визуализации данных, поскольку Plotly позволяет пользователям наводить курсор на точки данных для запроса атрибутов точек данных. Команды следующие:
import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px
Затем мы загрузим и проверим обработанный фрейм данных из GitHub. Также важно пометить столбец генов как столбец индекса, чтобы мы могли ссылаться на конкретные точки на имена генов. Команды следующие:
df = pd.read_csv('https://raw.githubusercontent.com/kuanrongchan/vaccine-studies/main/Ad5_seroneg.csv',index_col=0) df.head()
Выходной файл показывает значения p-значения (pval), скорректированных p-значений (qval), отношения и кратного изменения (fc) для 6-часового, 1-дневного, 3-дневного и 7-дневного временных точек по сравнению с базовый уровень (момент времени = 0):
Следующим шагом будет создание новых столбцов для log2FC и -log10 (скорректированное значение p). Команды следующие:
df['log2FC_6h'] = np.log2(df['ratio_6h']) df['log2FC_1d'] = np.log2(df['ratio_1d']) df['log2FC_3d'] = np.log2(df['ratio_3d']) df['log2FC_7d'] = np.log2(df['ratio_7d']) df['negative_log_pval_6h'] = np.log10(df['qval_6h']) * (-1) df['negative_log_pval_1d'] = np.log10(df['qval_1d']) * (-1) df['negative_log_pval_3d'] = np.log10(df['qval_3d']) * (-1) df['negative_log_pval_7d'] = np.log10(df['qval_7d']) * (-1)
Теперь мы готовы построить графики вулканов для разных временных точек. Преимущество использования Python в том, что мы можем наложить графики вулканов в разные моменты времени на одном графике. Команды следующие:
fig = go.Figure() trace1 = go.Scatter( x=df['log2FC_6h'], y=df['negative_log_pval_6h'], mode='markers', name='6hrs', hovertext=list(df.index) ) trace2 = go.Scatter( x=df['log2FC_1d'], y=df['negative_log_pval_1d'], mode='markers', name='day 1', hovertext=list(df.index) ) trace3 = go.Scatter( x=df['log2FC_3d'], y=df['negative_log_pval_3d'], mode='markers', name='day 3', hovertext=list(df.index) ) trace4 = go.Scatter( x=df['log2FC_7d'], y=df['negative_log_pval_7d'], mode='markers', name='day 7', hovertext=list(df.index) ) fig.add_trace(trace1) fig.add_trace(trace2) fig.add_trace(trace3) fig.add_trace(trace4) fig.update_layout(title='Volcano plot for seronegatives') fig.show()
Я дам краткое описание приведенного выше кода. Сначала мы сообщаем Plotly, что собираемся построить фигуру с помощью команды go.Figure (). Затем мы накладываем разные диаграммы рассеяния, используя разные трассы (по одной для каждой временной точки). В каждой трассе мы указываем (i) столбцы для осей x и y, (ii) указываем, что мы хотим только построить точки, используя mode = 'markers', (iii) указываем условные обозначения рисунков для различных трасс и (iv) указывать текстовые метки при наведении курсора на точки данных. В разделе «fig.update_layout» мы также добавили заголовок сюжета. Таким образом, результат для графика выглядит следующим образом:
С первого взгляда вы можете быстро понять, что в день 1 гены экспрессируются наиболее дифференцированно по сравнению с другими временными точками. Вы также можете навести указатель мыши на точки данных, чтобы проверить, какой из этих генов экспрессируется наиболее дифференциально. В качестве примера я привел CXCL10, один из генов, который в значительной степени индуцируется через день после вакцинации.
Теперь, когда мы установили, что день 1 является наиболее интересным моментом времени, мы можем рассмотреть гены, расположенные по краям графика вулкана. Мы можем ввести команду ниже, чтобы построить график вулкана первого дня. Обратите внимание, что на этот раз я добавил текст на графике вулкана (используя команду «textposition»), чтобы мы могли быстро визуализировать гены, которые выражаются наиболее по-разному:
fig_d1 = px.scatter(df, x='log2FC_1d', y='negative_log_pval_1d', text=df.index) fig_d1.update_traces(textposition='top center') fig_d1.update_layout( title_text='Volcano plot for seronegatives (day 1)' ) fig_d1.show()
Выходной файл выглядит следующим образом:
Теперь мы можем быстро визуализировать, что гены с максимальной активностью в день 1 включают гены, связанные с интерфероном, такие как IDO1, CXCL10, RSAD2, CCL2, CCL8 и LAMP3. Как вы уже понимаете, график вулкана позволяет пользователям быстро воспринимать данные и визуализировать наиболее важные гены и белки, которые экспрессируются наиболее по-разному.
Для удобства использования полный набор кодов можно найти ниже:
Вот и все. Спасибо за прочтение.