Заказать столбцы в ggplot2 гистограмма - PullRequest
268 голосов
/ 06 марта 2011

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

    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)

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

Ответы [ 12 ]

3 голосов
/ 14 февраля 2019

Поскольку мы смотрим только на распределение одной переменной ("Положение"), а не на соотношение между двумя переменными , то, возможно, гистограмма будет более подходящим графиком. ggplot имеет geom_histogram () , что упрощает:

ggplot(theTable, aes(x = Position)) + geom_histogram(stat="count")

enter image description here

Использование geom_histogram ():

Я думаю, geom_histogram () немного странно, так как обрабатывает непрерывные и дискретные данные по-разному.

Для непрерывных данных вы можете использовать geom_histogram () без параметров. Например, если мы добавим в числовой вектор «Оценка» ...

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

и использовать geom_histogram () в переменной «Score» ...

ggplot(theTable, aes(x = Score)) + geom_histogram()

enter image description here

Для дискретных данных , таких как «Положение», мы должны указать вычисляемую статистику, вычисляемую эстетикой, чтобы получить значение y для высоты столбцов, используя stat = "count":

 ggplot(theTable, aes(x = Position)) + geom_histogram(stat = "count")

Примечание: Любопытно и запутанно, вы также можете использовать stat = "count" для непрерывных данных, и я думаю, что это обеспечивает более эстетичный график.

ggplot(theTable, aes(x = Score)) + geom_histogram(stat = "count")

enter image description here

Правки : расширенный ответ в ответ на полезные предложения DebanjanB .

1 голос
/ 03 февраля 2019

Другая альтернатива, использующая изменить порядок , чтобы упорядочить уровни фактора. В порядке возрастания (n) или в порядке убывания (-n) в зависимости от количества. Очень похоже на использование fct_reorder из пакета forcats:

По убыванию

df %>%
  count(Position) %>%
  ggplot(aes(x = reorder(Position, -n), y = n)) +
  geom_bar(stat = 'identity') +
  xlab("Position")

enter image description here

по возрастанию

df %>%
  count(Position) %>%
  ggplot(aes(x = reorder(Position, n), y = n)) +
  geom_bar(stat = 'identity') +
  xlab("Position")

enter image description here

Фрейм данных:

df <- structure(list(Position = structure(c(3L, 3L, 1L, 1L, 1L, 2L), .Label = c("Defense", 
"Striker", "Zoalkeeper"), class = "factor"), Name = structure(c(2L, 
1L, 3L, 5L, 4L, 6L), .Label = c("Frank", "James", "Jean", "John", 
"Steve", "Tim"), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))
...