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
- Dibuixa un gràfic de línies amb la concentració de dos fàrmacs amb diferents k_elim i afegeix una llegenda.
- Crea un gràfic de barres amb les dosis de 5 medicaments i canvia els colors de cada barra.
- 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.pngamb alta resolució.