es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer que todas las muestras/datos de secuenciación “no clasificados” se muestren en gris, puedes utilizar una declaración if con str_detect() del paquete stringr para verificar si el nombre de la muestra contiene “_unclassified”, y luego utilizar scale_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ón mutate(). Luego, la declaración if verifica si algún nombre de muestra contiene “_unclassified” utilizando str_detect(), y establece el color de relleno en gris para esas muestras utilizando scale_fill_manual() y fill_colors <- c("grey50", rep("blue", length(taxa_names(physeq_obj))-1)). Si no hay muestras “_unclassified”, se utiliza en su lugar fill_colors <- rep("blue", length(taxa_names(physeq_obj))).

Comments are closed.