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 / 77341841
Accepted
Adrian
Adrian
Asked: 2023-10-23 06:01:16 +0800 CST2023-10-23 06:01:16 +0800 CST 2023-10-23 06:01:16 +0800 CST

Ordene diminuindo a ordem em múltiplas variáveis ​​para geom_errorbar do ggplot2

  • 772
library(ggplot2)
mydat <- data.frame(mean = c(23, 24, 15, 27, 18, 19, 23, 20, 32),
           lower = c(20, 19, 13, 15, 14, 18, 20, 17, 20),
           upper = c(25, 29, 17, 39, 22, 20, 26, 23, 40),
           class = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
           domain = c("North", "North", "North", "West", "West", "West", "South", "South", "South"))
mydat$class <- as.factor(mydat$class)
mydat$domain <- as.factor(mydat$domain)

mydat %>% ggplot(aes(x = mean, y = class, color = domain, Group = domain, xmin = lower, xmax = upper)) +
  geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + theme_light() + geom_point(position = position_dodge(width = 0.5)) + xlab("Counts")

insira a descrição da imagem aqui

Gostaria de ordenar diminuindo o valor dos limites superiores (ou seja, upper) da barra de erro dentro de cada um classe também entre domains. A saída desejada é esta:

insira a descrição da imagem aqui

Tentei o seguinte código mas não surtiu o efeito desejado:

library(forcats)
mydat %>% ggplot(aes(x = mean, y = class, color = fct_infreq(domain), Group = fct_infreq(domain), xmin = lower, xmax = upper)) +
  geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + theme_light() + geom_point(position = position_dodge(width = 0.5)) + xlab("Counts")
  • 2 2 respostas
  • 45 Views

2 respostas

  • Voted
  1. Best Answer
    jared_mamrot
    2023-10-23T06:57:10+08:002023-10-23T06:57:10+08:00

    Não creio que exista uma maneira “fácil” de alcançar esse resultado; quando você reordena seu eixo y de acordo com max(upper)a ordem 'definida' para todos os domínios (embora eu ficaria feliz em provar que estou errado nisso).

    Uma possível solução alternativa seria dividir seus gráficos por classe e reordenar cada um separadamente, por exemplo

    library(tidyverse)
    
    mydat <- data.frame(mean = c(23, 24, 15, 27, 18, 19, 23, 20, 32),
                        lower = c(20, 19, 13, 15, 14, 18, 20, 17, 20),
                        upper = c(25, 29, 17, 39, 22, 20, 26, 23, 40),
                        class = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
                        domain = c("North", "North", "North", "West", "West", "West", "South", "South", "South"))
    mydat$class <- as.factor(mydat$class)
    mydat$domain <- as.factor(mydat$domain)
    
    colour_palette <- scales::hue_pal()(3)
    
    mydat %>%
      group_split(class) %>%
      map(~{ggplot(data = .x,
                   aes(x = mean, y = fct_reorder(.f = class, .x = upper, .fun = max),
                       color = fct_reorder(.f = domain, .x = upper, .fun = max),
                       Group = fct_reorder(.f = domain, .x = upper, .fun = max),
                       xmin = lower, xmax = upper)) +
      geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + 
      theme_light() + 
      geom_point(position = position_dodge(width = 0.5)) +
          xlab("Counts") +
          ylab("Class") +
          scale_color_manual(values = c("North" = colour_palette[1],
                                        "South" = colour_palette[2],
                                        "West" = colour_palette[3]),
                             name = "Domain")})
    #> [[1]]
    

    #> 
    #> [[2]]
    

    #> 
    #> [[3]]
    

    Criado em 23/10/2023 com reprex v2.0.2


    Se você fizer isso 'manualmente', poderá organizá-los na ordem desejada, por exemplo

    library(tidyverse)
    
    mydat <- data.frame(mean = c(23, 24, 15, 27, 18, 19, 23, 20, 32),
                        lower = c(20, 19, 13, 15, 14, 18, 20, 17, 20),
                        upper = c(25, 29, 17, 39, 22, 20, 26, 23, 40),
                        class = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
                        domain = c("North", "North", "North", "West", "West", "West", "South", "South", "South"))
    mydat$class <- as.factor(mydat$class)
    mydat$domain <- as.factor(mydat$domain)
    
    colour_palette <- scales::hue_pal()(3)
    
    p1 <- mydat %>%
      filter(class == "A") %>%
      ggplot(aes(x = mean, y = fct_reorder(.f = class, .x = upper, .fun = max),
                       color = fct_reorder(.f = domain, .x = upper, .fun = max),
                       Group = fct_reorder(.f = domain, .x = upper, .fun = max),
                       xmin = lower, xmax = upper)) +
          geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + 
          theme_light(base_size = 18) + 
          geom_point(position = position_dodge(width = 0.5)) +
          xlab("") +
          ylab("") +
          scale_color_manual(values = c("North" = colour_palette[1],
                                        "South" = colour_palette[2],
                                        "West" = colour_palette[3]),
                             name = "Domain") +
      scale_x_continuous(limits = c(10, 45))
    
    p2 <- mydat %>%
      filter(class == "B") %>%
      ggplot(aes(x = mean, y = fct_reorder(.f = class, .x = upper, .fun = max),
                 color = fct_reorder(.f = domain, .x = upper, .fun = max),
                 Group = fct_reorder(.f = domain, .x = upper, .fun = max),
                 xmin = lower, xmax = upper)) +
      geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + 
      theme_light(base_size = 18) + 
      geom_point(position = position_dodge(width = 0.5)) +
      xlab("Counts") +
      ylab("") +
      scale_color_manual(values = c("North" = colour_palette[1],
                                    "South" = colour_palette[2],
                                    "West" = colour_palette[3]),
                         name = "Domain") +
      theme(legend.position = "none") +
      scale_x_continuous(limits = c(10, 45))
    
    p3 <- mydat %>%
      filter(class == "C") %>%
      ggplot(aes(x = mean, y = fct_reorder(.f = class, .x = upper, .fun = max),
                 color = fct_reorder(.f = domain, .x = upper, .fun = max),
                 Group = fct_reorder(.f = domain, .x = upper, .fun = max),
                 xmin = lower, xmax = upper)) +
      geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) + 
      theme_light(base_size = 18) + 
      geom_point(position = position_dodge(width = 0.5)) +
      xlab("") +
      ylab("") +
      scale_color_manual(values = c("North" = colour_palette[1],
                                    "South" = colour_palette[2],
                                    "West" = colour_palette[3]),
                         name = "Domain") +
      theme(legend.position = "none") +
      scale_x_continuous(limits = c(10, 45))
    
    library(patchwork)
    p3 / p1 / p2
    

    Criado em 23/10/2023 com reprex v2.0.2

    • 1
  2. ThomasIsCoding
    2023-10-23T07:37:14+08:002023-10-23T07:37:14+08:00

    Não consigo descobrir o mesmo resultado que você esperava, mas espero que o código a seguir faça sentido para você de forma equivalente (onde domainas informações são adicionadas como rótulos a cada barra de erros)

    mydat %>%
        mutate(class = factor(class, names(sort(by(upper, class, max))))) %>%
        arrange(class, desc(upper)) %>%
        mutate(color = factor(n() - row_number()), .by = class) %>%
        ggplot(aes(x = mean, y = class, color = color, Group = domain, xmin = lower, xmax = upper)) +
        geom_errorbar(width = 0.1, position = position_dodge(width = 0.5)) +
        geom_text(aes(label = domain), position = position_dodge(0.5)) +
        theme_light() +
        geom_point(position = position_dodge(width = 0.5)) +
        xlab("Counts")
    

    insira a descrição da imagem aqui

    Dados

    mydat <- data.frame(
        mean = c(23, 24, 15, 27, 18, 19, 23, 20, 32),
        lower = c(20, 19, 13, 15, 14, 18, 20, 17, 20),
        upper = c(25, 29, 17, 39, 22, 20, 26, 23, 40),
        class = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
        domain = c("North", "North", "North", "West", "West", "West", "South", "South", "South")
    )
    
    • 1

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