R порядок geom_bar на основе одного уровня - PullRequest
2 голосов
/ 10 февраля 2020

Как я могу заказать гистограмму на основе первого уровня переменной var? Теперь ордер на сумму двух баров Я бы хотел, чтобы он был заказан только по value, где var равно "first". Ниже рабочий пример.

library("ggplot2")
ct <- rep(c("A", "B", "C", "D"),  2)
var <- c("first","first","first","first","second","second","second","second")
value <- c(1,5,0.5,8,2,11,0.2,0.1)

df <- data.frame(ct, var, value)
df

ggplot() +
  geom_bar(data = df
           , aes(x = reorder(ct, value)
                 , y = value
                 , fill = var
           )
           , stat = "identity"
           , position = "dodge"
           , width = .90 )

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

С forcats::fct_reorder2() вам не нужно изменять data.frame:

library(ggplot2)
library(forcats)

ggplot() +
  geom_bar(data = df
           , aes(x = forcats::fct_reorder2(ct, var=='first', value, .desc = F)
                 , y = value
                 , fill = var
           )
           , stat = "identity"
           , position = "dodge"
           , width = .90 ) + labs(x = "ct")

enter image description here

1 голос
/ 10 февраля 2020

Это должно сделать это.

df %>% # take the dataframe and then...
    group_by(ct) %>% # per group...
    mutate(order = sum(value * (var == "first"))) %>% # you calculate the sum of value where var is "first"
    ggplot(aes(reorder(ct, order) # ...and then plot everything.
               , value
               , fill = var)) +
    geom_bar(stat = "identity"
             , position = "dodge"
             , width = .9)

enter image description here

...