Python

Tema 5 · Matplotlib

Introducció

Matplotlib és la biblioteca més utilitzada per crear gràfics en Python. Permet fer des de simples diagrames de barres fins a complexes figures multipanel. Amb pyplot podem representar dades experimentals, cinètiques de fàrmacs, distribucions de propietats moleculars i molt més.

Objectius

  • Crear gràfics de línies, barres, dispersió i histogrames
  • Personalitzar títols, etiquetes, llegendes i colors
  • Fer subplots per comparar múltiples gràfics
  • Desar figures en formats PNG o PDF

Gràfic de línies: cinètica d'un fàrmac

import matplotlib.pyplot as plt
import numpy as np

temps = np.linspace(0, 24, 100)  # 0 a 24 hores
dosi = 100  # mg
k_elim = 0.15  # h⁻¹

concentracio = dosi * np.exp(-k_elim * temps)

plt.figure(figsize=(8, 5))
plt.plot(temps, concentracio, 'b-', linewidth=2, label='Fàrmac A')
plt.xlabel('Temps (hores)')
plt.ylabel('Concentració (mg/L)')
plt.title('Cinètica de primer ordre')
plt.grid(alpha=0.3)
plt.legend()
plt.savefig('cinetica.png', dpi=150)
plt.show()

Gràfics de barres i dispersió

Comparació de pesos moleculars i LogP de compostos:

# Dades d'exemple
farmacs = ['Ibu', 'Par', 'Amox', 'Omep', 'Lorat']
MW = [206, 151, 365, 345, 382]
LogP = [3.5, 0.5, 0.9, 2.2, 4.0]

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# Barres
ax1.bar(farmacs, MW, color='teal', alpha=0.8)
ax1.set_xlabel('Fàrmac')
ax1.set_ylabel('Pes molecular (Da)')
ax1.set_title('Pes molecular')

# Dispersió
ax2.scatter(LogP, MW, c='coral', s=100, edgecolors='black')
for i, f in enumerate(farmacs):
    ax2.annotate(f, (LogP[i], MW[i]), textcoords="offset points", xytext=(5,5))
ax2.set_xlabel('LogP')
ax2.set_ylabel('MW (Da)')
ax2.set_title('LogP vs MW')

plt.tight_layout()
plt.savefig('comparacio_farmacs.png', dpi=150)
plt.show()

Histogrames i personalització

# Distribució de pesos moleculars d'una biblioteca
np.random.seed(42)
MW_llib = np.random.normal(350, 100, 1000)  # mitjana 350, sd 100

plt.figure(figsize=(8, 5))
plt.hist(MW_llib, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
plt.axvline(500, color='red', linestyle='--', label='Límit Lipinski (500)')
plt.xlabel('Pes molecular (Da)')
plt.ylabel('Freqüència')
plt.title('Distribució de MW en la biblioteca')
plt.legend()
plt.savefig('histograma_mw.png', dpi=150)
plt.show()

Exercicis

  1. Dibuixa un gràfic de línies amb la concentració de dos fàrmacs amb diferents k_elim i afegeix una llegenda.
  2. Crea un gràfic de barres amb les dosis de 5 medicaments i canvia els colors de cada barra.
  3. A partir d'un array de valors de pressió arterial, fes un histograma i assenyala els llindars de normalitat (120 i 80 mmHg).

Mini Projecte – Visualització de resultats d'un cribratge

Utilitza Matplotlib per visualitzar dades d'un estudi de cribratge farmacològic:

  • Carrega un DataFrame de Pandas amb columnes: nom, MW, LogP, score_docking.
  • Crea una figura amb 2x2 subplots: histograma de MW, histograma de LogP, scatter plot de MW vs LogP, i scatter plot de MW vs score_docking.
  • En el gràfic de dispersió MW vs LogP, pinta els punts que compleixen Lipinski d'un color i els que no d'un altre.
  • Ajusta títols, etiquetes i afegeix una graella suau.
  • Desa la figura com a informe_visual.png amb alta resolució.