Visualización

🌳 Visualización de árboles filogenéticos

La visualización es clave en el análisis filogenético porque nos permite:

🔎 Explorar rápidamente la topología del árbol.
🧩 Manipular el árbol para resaltar procesos evolutivos que podrían explicar su topología.
📊 Comunicar resultados de manera clara.
🖼️ Generar figuras listas para publicación.

En R contamos con dos enfoques principales:

Visualización con R base

library(ape)
# Archivo ML (NEWICK)
f_raxml <- "../docs/raxml_cox1_Stenopelmatus.tre"

# Lectura con ape
ml_phylo <- read.tree(f_raxml)

# Graficar con plot R-base
plot(ml_phylo, main = "Árbol con función base")

  • plot da una visualización inmediata y sencilla.

  • Opciones limitadas y complicadas de personalización (colores, etiquetas, etc.).

  • Sirve para inspección rápida, no para figuras de publicación.

Visualización con ggtree

Ejemplo básico

library(tidyverse)
library(ggtree)
ggtree(ml_phylo) +
  ggtitle("Árbol con ggtree")

  • Usa la gramática de gráficos de ggplot2 (capas, estéticas).

  • Permite distintos layouts: slanted, circular, fan, etc.

  • Integra fácilmente metadatos y anotaciones.

Layouts (diseños gráficos del árbol) en ggtree

library(patchwork)

# 9 variantes de layout/diseño
plots <- list(
  ggtree(ml_phylo),                                            # A recto
  ggtree(ml_phylo, layout = "slanted"),                        # B diagonal
  ggtree(ml_phylo, layout = "circular"),                       # C circular
  ggtree(ml_phylo, layout = "fan", open.angle = 120),          # D abanico
  ggtree(ml_phylo, layout = "equal_angle"),                    # E ángulos iguales
  ggtree(ml_phylo, layout = "daylight"),                       # F daylight
  ggtree(ml_phylo, branch.length = "none"),                    # G sin longitudes
  ggtree(ml_phylo, branch.length = "none", layout = "circular"),# H sin longitudes + circular
  ggtree(ml_phylo, layout = "daylight", branch.length = "none") # I daylight + sin longitudes
)

# Márgenes uniformes para que no “salten”
plots <- lapply(plots, function(p) p + theme(plot.margin = margin(6,6,6,6)))

# Armar la grilla 3x3 y etiquetar A–I automáticamente
p_grid <- wrap_plots(plots, ncol = 3) + plot_annotation(tag_levels = "A")
p_grid