Skip to content

Manhattan Plot in Matplotlib — Complete Guide

DodaTech Updated 2025-01-15 2 min read

You will learn how to create a publication-quality Manhattan plot for GWAS results using Matplotlib.

The Problem

Vizualizarea asocierilor dintre markeri genetici si trasaturi fenotipice necesita un grafic care sa evidentieze varfurile semnificative pe intreg genomul. Un Manhattan plot prost construit ascunde semnalul real.

The Wrong Way

Trasarea punctelor fara alternarea culorilor pe cromozomi si fara linia de semnificatie:

import matplotlib.pyplot as plt
import numpy as np
chromosomes = np.repeat(range(1, 23), 100)
positions = np.tile(range(100), 22)
p_values = -np.log10(np.random.uniform(0, 1, 2200))
plt.scatter(range(2200), p_values, c='blue', s=5)
plt.show()

Ce se intampla: Graful este greu de citit, cromozomii nu se disting, iar pragul de semnificatie lipseste.

The Right Way

Alternarea culorilor pe cromozomi si adaugarea liniei de semnificatie genomica:

chromosomes = np.repeat(range(1, 23), 100)
positions = np.tile(range(100), 22)
p_values = -np.log10(np.random.uniform(0, 1, 2200))

colors = ['#1f77b4' if c % 2 else '#ff7f0e' for c in chromosomes]
x_pos = np.arange(len(p_values))

plt.figure(figsize=(14, 5))
plt.scatter(x_pos, p_values, c=colors, s=8, alpha=0.7)
plt.axhline(-np.log10(5e-8), color='red', linestyle='--', linewidth=1,
            label='Genome-wide significance (5e-8)')

chrom_ticks = [np.mean(np.where(chromosomes == c)[0])
               for c in range(1, 23)]
plt.xticks(chrom_ticks, range(1, 23), fontsize=8)
plt.xlabel('Chromosome'), plt.ylabel('-log10(p-value)')
plt.title('Manhattan Plot - GWAS Results')
plt.legend()
plt.tight_layout()
plt.show()

Rezultat asteptat: Un grafic clar, cu cromozomi alternati cromatic, axa X etichetata corect si pragul de semnificatie vizibil.

Step-by-Step Fix

1. Pregateste datele

Asigura-te ca datele contin cromozom, pozitie si p-value pentru fiecare marker.

2. Calculeaza pozitiile pe axa X

cumulative_pos = []
for chrom in range(1, 23):
    chrom_data = data[data['chrom'] == chrom]
    cumulative_pos.extend(chrom_data['pos'].values +
                          (cumulative_pos[-1] if cumulative_pos else 0))

3. Adauga liniile de semnificatie

plt.axhline(-np.log10(5e-8), color='red', ls='--', lw=1)
plt.axhline(-np.log10(1e-5), color='blue', ls=':', lw=1,
            alpha=0.5, label='Suggestive (1e-5)')

Prevention Tips

  • Alternarea culorilor intre cromozomi pentru lizibilitate maxima
  • Adauga intotdeauna linia de semnificatie genomica la 5e-8
  • Eticheteaza axa X cu numerele cromozomilor, nu cu pozitii brute
  • Foloseste transparenta (alpha=0.7) pentru puncte suprapuse
  • Pastreaza raportul de aspect care evidentiaza varfurile semnificative

Common Mistakes

  1. Nu alterneaza culorile -- cromozomii sunt greu de distins
  2. Omite linia de semnificatie -- nu se vede ce asocieri sunt semnificative
  3. Eticheteaza gresit axa X -- cu pozitii brute in loc de numere de cromozomi
  4. Foloseste puncte prea mari -- satureaza graficul si ascunde detalii
  5. Nu ajusteaza layout-ul -- etichetele se suprapun si graficul devine ilizibil

Practice Exercise

Creaza un Manhattan plot pentru un set GWAS real (100k markeri, 22 cromozomi). Evidentiaza top 5 asocieri cu o culoare diferita.

FAQ

### Ce este un Manhattan plot?

Un grafic care afiseaza -log10(p-value) pentru markeri genetici de-a lungul cromozomilor. Varfurile indica asocieri semnificative.

Ce este pragul de 5e-8?

Pragul standard pentru semnificatie genomica dupa corectia Bonferroni pentru ~1 milion de teste independente.

Cum colorez corect cromozomii?

Alternarea a doua culori (de exemplu albastru si portocaliu) intre cromozomi consecutivi asigura lizibilitate maxima.

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro. DodaTech tools integrate seamlessly with Python Data Science workflows for enhanced productivity and security.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro