modify - r ggplot legend values




Заказать бары в гистограмме ggplot2 (7)

@GavinSimpson: reorder является мощным и эффективным решением для этого:

ggplot(theTable,
       aes(x=reorder(Position,Position,
                     function(x)-length(x)))) +
       geom_bar()

Я пытаюсь создать гистограмму, где наибольшая полоса будет ближе всего к оси y, и самый короткий бар будет самым дальним. Так что это похоже на таблицу, которую я имею

    Name   Position
1   James  Goalkeeper
2   Frank  Goalkeeper
3   Jean   Defense
4   Steve  Defense
5   John   Defense
6   Tim    Striker

Поэтому я пытаюсь построить гистограмму, которая показывала бы количество игроков в соответствии с положением

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

но на графике показан бар вратаря, затем защита, и, наконец, форвард. Я бы хотел, чтобы график был заказан так, чтобы защитный бар был ближе всего к оси y, к вратарю и, наконец, к форварду. Спасибо


В дополнение к forcats :: fct_infreq, указанному @HolgerBrandl, есть forcats :: fct_rev, который меняет порядок факторов.

theTable <- data.frame(
    Position= 
        c("Zoalkeeper", "Zoalkeeper", "Defense",
          "Defense", "Defense", "Striker"),
    Name=c("James", "Frank","Jean",
           "Steve","John", "Tim"))

p1 <- ggplot(theTable, aes(x = Position)) + geom_bar()
p2 <- ggplot(theTable, aes(x = fct_infreq(Position))) + geom_bar()
p3 <- ggplot(theTable, aes(x = fct_rev(fct_infreq(Position)))) + geom_bar()

gridExtra::grid.arrange(p1, p2, p3, nrow=3)             


Если столбцы диаграммы взяты из числовой переменной, как в приведенной ниже таблице данных, вы можете использовать более простое решение:

ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) 
+ geom_bar(stat = "identity")  

Знак минус перед переменной сортировки (-Qty) контролирует направление сортировки (восходящий / нисходящий)

Вот некоторые данные для тестирования:

df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"),  
                 Qty = c(7,4,5,1,3,6)
                )

**Sample data:**
  Colors Qty
1  Green   7
2 Yellow   4
3   Blue   5
4    Red   1
5 Yellow   3
6   Blue   6

Когда я нашел эту тему, это был ответ, который я искал. Надеюсь, это полезно для других.


Используя scale_x_discrete (limits = ...) укажите порядок баров.

positions <- c("Goalkeeper", "Defense", "Striker")
p <- ggplot(theTable, aes(x = Position)) + scale_x_discrete(limits = positions)

Подобно reorder() в ответе Алекса Брауна, мы также можем использовать forcats::fct_reorder() . Он будет в основном сортировать факторы, указанные в 1-м аргументе, в соответствии со значениями во втором аргументе после применения указанной функции (по умолчанию = медиана, что мы используем здесь, так как просто одно значение для каждого уровня фактора).

Жаль, что в вопросе OP требуемый порядок также является алфавитным, поскольку это порядок сортировки по умолчанию при создании факторов, поэтому скрыть то, что эта функция фактически делает. Чтобы это стало яснее, я заменил «Вратаря» на «Zoalkeeper».

library(tidyverse)
library(forcats)

theTable <- data.frame(
                Name = c('James', 'Frank', 'Jean', 'Steve', 'John', 'Tim'),
                Position = c('Zoalkeeper', 'Zoalkeeper', 'Defense',
                             'Defense', 'Defense', 'Striker'))

theTable %>%
    count(Position) %>%
    mutate(Position = fct_reorder(Position, n, .desc = TRUE)) %>%
    ggplot(aes(x = Position, y = n)) + geom_bar(stat = 'identity')


Простое перераспределение факторов, основанных на dplyr, может решить эту проблему:

library(dplyr)

#reorder the table and reset the factor to that ordering
theTable %>%
  group_by(Position) %>%                              # calculate the counts
  summarize(counts = n()) %>%
  arrange(-counts) %>%                                # sort by counts
  mutate(Position = factor(Position, Position)) %>%   # reset factor
  ggplot(aes(x=Position, y=counts)) +                 # plot 
    geom_bar(stat="identity")                         # plot histogram

Я согласен с zach, что подсчет в dplyr - лучшее решение. Я нашел, что это самая короткая версия:

dplyr::count(theTable, Position) %>%
          arrange(-n) %>%
          mutate(Position = factor(Position, Position)) %>%
          ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity")

Это также будет значительно быстрее, чем переупорядочение уровней факторов заблаговременно, поскольку счет выполняется в dplyr, а не в ggplot или с использованием table .





r-faq