AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77707037
Accepted
zhang
zhang
Asked: 2023-12-23 16:20:40 +0800 CST2023-12-23 16:20:40 +0800 CST 2023-12-23 16:20:40 +0800 CST

Como alterar a cor de fundo do painel com base em rótulos discretos do eixo y no ggplot2 em R?

  • 772

Tenho um dataframe nomeado plot_dfem R com a seguinte estrutura:

# Import the library
library(ggplot2)

# Create a sample data
set.seed(123)
plot_df <- data.frame(gene = rep(paste0("ENSG", 1:10, ".17"), each = 2),
                      mean = rnorm(20, 0.5, 0.1),
                      sd = rnorm(20, 0.02, 0.01),
                      group = rep(c("group_a", "group_b"), 10))

Estou tentando criar um ggplot com pontos e barras de erro, onde o eixo y representa os nomes dos genes (como rótulos discretos), o eixo x representa os valores médios e a cor representa o grupo (ou "group_a" ou " grupo_b"). Aqui está o código que estou usando:

ggplot(plot_df, aes(y=gene)) + 
    geom_point(aes(x=mean, color = group), position = position_dodge(width=0.9)) + 
    geom_errorbar(aes(xmin=mean-sd, xmax=mean+sd, color = group), width=.2,
                 position=position_dodge(.9)) + 
    geom_vline(aes(xintercept=0.5), linetype=2, color = 'gray') + 
    theme_bw() + 
    theme(panel.background = element_blank(),
          panel.grid.major = element_blank(), 
          panel.grid.minor = element_blank())

insira a descrição da imagem aqui

No entanto, quero alterar a cor de fundo do painel com base nos nomes dos genes no eixo y (cada gene tem uma cor diferente ou os genes vizinhos não têm a mesma cor). Como meus rótulos do eixo y são discretos, não sei como conseguir isso. Qualquer ajuda seria apreciada. Obrigado!

Eu tentei:

Altere a cor de fundo entre dia e noite no ggplot2 em R

  • 2 2 respostas
  • 53 Views

2 respostas

  • Voted
  1. Best Answer
    TarJae
    2023-12-23T16:56:19+08:002023-12-23T16:56:19+08:00

    Aqui está uma solução usando geom_tile(),

    1. Criamos um quadro de dados para as cores de fundo
    2. Enquanto usamos geom_tile()definiremos a xestética de forma a cobrir toda a largura do terreno e ajustaremos a largura de cada ladrilho de acordo.
    3. geom_tile()usa x = sum(x_limits) / 2para posicionar os ladrilhos no centro do lote e width = diff(x_limits)garantir que cada ladrilho ocupe toda a largura do lote
    
    library(ggplot2)
    library(dplyr)
    
    set.seed(123)
    plot_df <- data.frame(
      gene = rep(paste0("ENSG", 1:10, ".17"), each = 2),
      mean = rnorm(20, 0.5, 0.1),
      sd = rnorm(20, 0.02, 0.01),
      group = rep(c("group_a", "group_b"), 10)
    )
    
    # df for background colors
    bg_df <- plot_df %>%
      distinct(gene) %>%
      arrange(gene) %>% 
      mutate(color = ifelse(row_number() %% 2 == 1, "gold", "lightgrey"))
    
    # x axis limts based on data 
    x_limits <- range(plot_df$mean - plot_df$sd, plot_df$mean + plot_df$sd, na.rm = TRUE)
    
    # the plot
    ggplot(plot_df, aes(y = gene, x = mean)) +
      geom_tile(data = bg_df, aes(y = gene, x = sum(x_limits) / 2, width = diff(x_limits), fill = color), 
                alpha = 0.3, inherit.aes = FALSE) +
      geom_point(aes(color = group), position = position_dodge(width = 0.9)) +
      geom_errorbar(aes(xmin = mean - sd, xmax = mean + sd, color = group), 
                    width = 0.2, position = position_dodge(.9)) +
      scale_color_manual(values = c("steelblue3", "red3"))+
      geom_vline(xintercept = 0.5, linetype = 2, color = 'gray80') +
      theme_bw() +
      theme(panel.background = element_blank(),
            panel.grid.major = element_blank(), 
            panel.grid.minor = element_blank(),
            legend.position = "right") +
      scale_fill_identity()
    

    insira a descrição da imagem aqui

    • 4
  2. 2023-12-24T01:10:33+08:002023-12-24T01:10:33+08:00

    Outra opção seria usar geom_recta convertendo os genes discretos em numéricos e adicionando -/+.5for ymin/ymax. Além disso, definir xmin/maxpermite -/+Infpreencher todo o painel, onde também reduzi a expansão da escala y para .5. Observe também que adicionei a scale_y_discreteprimeira camada para forçar uma escala discreta.

    library(ggplot2)
    library(dplyr)
    
    set.seed(123)
    plot_df <- data.frame(
      gene = rep(paste0("ENSG", 1:10, ".17"), each = 2),
      mean = rnorm(20, 0.5, 0.1),
      sd = rnorm(20, 0.02, 0.01),
      group = rep(c("group_a", "group_b"), 10)
    )
    
    plot_df <- plot_df |>
      mutate(
        ymin = as.numeric(factor(gene)) - .5,
        ymax = as.numeric(factor(gene)) + .5,
        fill = factor(as.numeric(factor(gene)) %% 2)
      )
    
    # the plot
    ggplot(plot_df, aes(y = gene)) +
      scale_y_discrete(expand = c(0, .5)) +
      geom_rect(
        aes(ymin = ymin, ymax = ymax, fill = fill, xmin = -Inf, xmax = Inf),
        alpha = .3
      ) +
      geom_point(aes(x = mean, color = group),
        position = position_dodge(width = 0.9)
      ) +
      geom_errorbar(aes(xmin = mean - sd, xmax = mean + sd, color = group),
        width = .2,
        position = position_dodge(.9)
      ) +
      geom_vline(aes(xintercept = 0.5), linetype = 2, color = "gray") +
      scale_fill_manual(values = c("grey90", "grey60"), guide = "none") +
      theme_bw() +
      theme(
        panel.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank()
      )
    

    • 2

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve