ampvis2
Un buen programa para realizar varias tipos de visualizaciones es ampvis2 que trabaja en R. Necesitamos dos archivos, una tabla de OTUs y una de metadatos y tener instalado R y de preferencia RStudio.
mg_classifier a partir de la versión 1.8.0 ya genera una tabla de otus compatible (OTU_table.tsv
) y la tabla de metadatos hay que crearla según las indicaciones aquí mencionadas. Es importante que los códigos de las muestras en ambas tablas sean idénticos.
Instalación de ampvis2
En la consola de R, dentro de RStudio pegar los siguientes comandos:
install.packages
("remotes")
remotes::install_github("MadsAlbertsen/ampvis2")
Formato de las tablas
Tabla de OTUs
La tabla de OTUs tiene que tener ciertas características, ser una tabla delimitada por tabuladores, pero principalmente al final tener las columnas de la taxonomía de cada OTU con un nombre concreto y solo los 7 niveles clásicos en inglés, empezando por Kingdom
.
Ejemplo
OTU F3D1 F3D141 F3D142 Kingdom Phylum Class Order Family Genus Species
OTU_3 2 0 0 Bacteria Bacteroidetes Bacteroidia Bacteroidales S24-7_f Unclassified_g Unclassified_s
OTU_5 0 0 0 Bacteria Firmicutes Clostridia Clostridiales Lachnospiraceae Unclassified_g Unclassified_s
OTU_6 0 0 0 Bacteria Bacteroidetes Bacteroidia Bacteroidales S24-7_f Unclassified_g Unclassified_s
OTU_7 0 0 0 Bacteria Firmicutes Clostridia Clostridiales Ruminococcaceae Unclassified_g Unclassified_s
OTU_8 0 0 0 Bacteria Firmicutes Clostridia Clostridiales Ruminococcaceae GQ175418_g Unclassified_s
Tabla de metadatos
La tabla de metadatos tiene un formato semejante, igual delimitada por tabuladores:
sample dpw time
F3D1 1 Early
F3D141 141 Late
F3D142 142 Late
El único requisito es que el nombre de la muestra (sample
) debe ser igual al que tiene la tabla de OTUs.
Cargar los archivos a RStudio
Importar tabla de OTUs
Dar click en Import Dataset y luego en "From Text..."
Seleccionar el archivo de tabla de otus, en este ejemplo, OTU_table.tsv
Revisar que este marcado Heading: Yes y Row names: Use first column
Ahora ya aparece la tabla de otus cargada en el panel superior derecho (flecha roja).
Importación de metadatos
Volvemos a hacer lo mismo para importar los metadatos.
Cargar el paquete de ampvis2
Abrir la pestaña Packages y dar click en el cuadro de ampvis2
Crear una objeto en ampvis2
Ya en la consola hay que crear un matriz (aquí llamada SOP) con los datos cargados
> SOP <- amp_load(otutable = OTU_table, metadata = metadata)
Se creará una nueva matriz con el nombre SOP (Fig Der), ésta matriz es la que usaremos para generar los análisis y visualizaciones. Como se ve en el ejemplo, al crear el objeto lanza una advertencia que hay una inconsistencia entre la tabla de OTUs y la de metadatos, esto es por que no hay la muestra llamada "Mock" en la tabla de metadatos, por lo que no utilizará esos datos que sí están en la tabla de OTUs.
Análisis
Rarefacción
Quizá el primer análisis a realizar es una curva de rarefacción con la función amp_rarecurve
:
> amp_rarecurve(data = SOP, stepsize = 50, color_by = "time")
Como se puede apreciar en la figura de la abajo a la izquierda, se generó una curva de rarefacción coloreada por la columna "time" de los metadatos. El comando stepsize
implica que tan frecuente hace el cálculo para generar la gráfica, a menor número, mas fina es la curva. Podemos mejorar la gráfica agrupando las muestras por algún elemento de los metadatos, en este caso de nuevo por "time".
> amp_rarecurve(data = SOP, stepsize = 50, color_by = "time", facet_by = "time")
El resultado está en la figura de abajo a la derecha.
Boxplot
Podemos visualizar los datos como un boxplot:
> amp_boxplot(data = SOP, group_by = "time", tax_add = "Phylum")
Al igual que en el caso anterior, están agrupadas por la columna "time" de los metadatos y a nivel género, que es el default, pero se puede cambiar. A cada género se le añadió además el phylum al que pertenece con tax_add
.
Análisis de Componentes Principales (PCA)
Para obtener un PCA:
> amp_ordinate(data = SOP, sample_color_by = "time")
pero también se le puede agregar un marcho a los puntos (Fig. abajo Der.):
> amp_ordinate(data = SOP, sample_color_by = "time", sample_colorframe = "time")
Heatmap
Para obtener un heatmap agrupados por "time" (group_by = "time"
), a nivel género (tax_aggregate)
pero mostrando también el phylum (tax_add = "Phylum"
) y mostrando los 20 taxa mas abundantes (tax_show = 20
):
> amp_heatmap(data = SOP, group_by = "time", tax_show = 20, tax_aggregate = "Genus", tax_add = "Phylum")
Diagram de Venn
Podemos crear un diagrama de Venn basándonos en un parámetro de los metadatos (group_by = "time"
) y a cierto porcentaje considerado como las OTUs presentes en el núcleo o core (cut_f = 95
), en este caso el 95%:
> amp_venn(data = SOP, group_by = "time", cut_f = 95)
Formateado de las gráficas
Debido a que estas gráficas son creadas con ggplot, es posible embellecerlas más. Por ejemplo, si usamos la función para la creación de una curva de rarefacción simple:
amp_rarecurve(data = SOP, stepsize = 50, color_by = "STAGE", facet_by = "STAGE")
se generará la figura de abajo a la izquierda, pero si agregamos los comandos de ggplot ( + theme()
) crearemos una mejor figura (abajo derecha), las letras son mas grandes, sin leyenda, líneas mas gruesas, etc.
amp_rarecurve(data = SOP, stepsize = 50, color_by = "time", facet_by = "time") +
theme(
axis.title.x = element_text(size = rel(1.4)),
axis.text.x = element_text(size = 14, angle = 0),
axis.ticks.x = element_blank(),
axis.title.y = element_text(size = rel(1.4)),
axis.text.y = element_text(size = 14),
axis.ticks.y = element_blank(),
legend.position = "none",
strip.text = element_text(size = 14, face = "bold"),
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "grey"),
) + geom_line(size = 1.0)
Lo mismo podemos hacer para la gráfica de componentes principales (PCA), el código simple (abajo Izq):
amp_ordinate(data = SOP, sample_color_by = "time", sample_point_size = 4, sample_label_by = "sample", sample_label_size = 5)
Aún mejor incluyendo los principales géneros (Abajo Der):
amp_ordinate(data = SOP, sample_color_by = "time", sample_point_size = 4, sample_label_by = "sample", sample_label_size = 5, species_plot = TRUE, species_nlabels = 16, filter_species = 1, species_label_size = 4, sample_colorframe = "time")
y el código tuneado (hasta abajo Der):
amp_ordinate(data = SOP, sample_color_by = "time", sample_point_size = 4, sample_label_by = "sample", sample_label_size = 5, species_plot = TRUE, species_nlabels = 16, filter_species = 1, species_label_size = 4, sample_colorframe = "time") +
theme(
axis.title.x = element_text(size = rel(1.2)),
axis.title.y = element_text(size = rel(1.2)),
axis.text.x = element_text(size = 14, vjust = 1),
axis.text.y = element_text(size = 14),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
strip.text = element_text(size = 14), # facets
panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "grey"),
legend.text = element_text(size = 14),
legend.title = element_text(size = 14, face = "bold"),
)
Heatmap mejorado y con escalas de grises
> amp_heatmap(data = SOP, group_by = "time", facet_by = "time", tax_aggregate = "Genus", tax_add = "Phylum", tax_show = 20, round = 2, plot_values_size = 6, color_vector = c("#f2f2f2", "#909190")) +
theme(
axis.text.x = element_text(size = 14, angle = 45, vjust = 1),
axis.text.y = element_text(size = 14, face = "italic"),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
strip.text = element_text(size = 14, face = "bold"),
)