Intentando cambiar el color de una variable en ggplot geom_bar dependiendo de la cadena de texto.
Tengo un bucle for para recorrer una gran cantidad de datos de microbioma (usando `phyloseq’) y generar gráficos para múltiples experimentos.
ggplot(data_M1, aes(x = Sample, y = Abundance, fill = get(i))) +
geom_bar(stat = "identity")+
facet_wrap(vars(Status, Time.Point, Treatment), scales = "free", ncol=2)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())+
guides(fill = guide_legend(reverse = TRUE, keywidth = 1, keyheight = 1, title = i))+
ylab(yaxisname)+
ggtitle(plotname)+
ggsave(ggsavename, last_plot())
Resultado de ejemplo: ejemplo de figura producida
Lo que estoy intentando hacer es hacer que todas las muestras/no secuencias “no clasificadas” sean de color gris… así que tal vez necesito algún tipo de declaración if con str contiene?
Estoy dispuesto a proporcionar un ejemplo reproducible si es necesario, pero quizás alguien tenga una solución sencilla.
¡Gracias!
davy.ai
Para hacer que todas las muestras/datos de secuenciación “no clasificados” se muestren en gris, puedes utilizar una declaración
if
constr_detect()
del paquetestringr
para verificar si el nombre de la muestra contiene “_unclassified”, y luego utilizarscale_fill_manual()
para establecer el color de relleno en gris para esas muestras. Aquí tienes un ejemplo del código:“`{r}
library(stringr)
for (i in taxa_names(physeq_obj)) {
data <- otu_table(physeq_obj) %>% as.data.frame() %>%
rownames_to_column(var = “Sample”) %>%
inner_join(tax_table(physeq_obj) %>% as.data.frame() %>%
rownames_to_column(var = “Taxon”) %>%
select(Taxon, get(i))) %>%
gather(Taxon, Abundance, -Sample) %>%
mutate(Status = gsub(“\d”, “”, Sample),
Time.Point = str_extract(Status, “[A-Za-z]+[0-9]*”),
Treatment = ifelse(str_detect(Status, “ctrl”), “Control”, “Treated”),
Sample = gsub(“_unclassified”, “”, Sample)) %>% # Eliminar “_unclassified” de los nombres de muestra
group_by(Status, Time.Point, Treatment, Sample) %>%
summarize(Abundance = sum(Abundance)) %>%
ungroup()
# Utilizar la declaración if y scale_fill_manual() para establecer el color de relleno en gris para las muestras “_unclassified”
if (“_unclassified” %in% data$Sample) {
fill_colors <- c("grey50", rep("blue", length(taxa_names(physeq_obj))-1)) data_M1 <- data %>% ggplot(aes(x = Sample, y = Abundance, fill = get(i))) +
geom_bar(stat = “identity”)+
facet_wrap(vars(Status, Time.Point, Treatment), scales = “free”, ncol=2)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())+
guides(fill = guide_legend(reverse = TRUE, keywidth = 1, keyheight = 1, title = i))+
ylab(yaxisname)+
ggtitle(plotname)+
scale_fill_manual(values = fill_colors) +
ggsave(ggsavename, last_plot())
} else {
fill_colors <- rep("blue", length(taxa_names(physeq_obj))) data_M1 <- data %>% ggplot(aes(x = Sample, y = Abundance, fill = get(i))) +
geom_bar(stat = “identity”)+
facet_wrap(vars(Status, Time.Point, Treatment), scales = “free”, ncol=2)+
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())+
guides(fill = guide_legend(reverse = TRUE, keywidth = 1, keyheight = 1, title = i))+
ylab(yaxisname)+
ggtitle(plotname)+
scale_fill_manual(values = fill_colors) +
ggsave(ggsavename, last_plot())
}
}
“`
En este ejemplo, el código primero elimina “_unclassified” de los nombres de las muestras utilizando
gsub("_unclassified", "", Sample)
en la funciónmutate()
. Luego, la declaraciónif
verifica si algún nombre de muestra contiene “_unclassified” utilizandostr_detect()
, y establece el color de relleno en gris para esas muestras utilizandoscale_fill_manual()
yfill_colors <- c("grey50", rep("blue", length(taxa_names(physeq_obj))-1))
. Si no hay muestras “_unclassified”, se utiliza en su lugarfill_colors <- rep("blue", length(taxa_names(physeq_obj)))
.