Я пытаюсь создать гистограмму, где самый большой столбец будет ближайшим к оси 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)
но на графике сначала показана полоса вратаря, затем защита и, наконец, нападающий. Я бы хотел, чтобы график был упорядочен таким образом, чтобы защитная планка была ближе к оси у, вратарской и, наконец, нападающей. Спасибо
ggplot2
, а не ОПОтветы:
Ключ к упорядочению - установить уровни фактора в нужном вам порядке. Упорядоченный фактор не требуется; дополнительная информация в упорядоченном множителе не требуется, и если эти данные используются в какой-либо статистической модели, это может привести к неправильной параметризации - полиномиальные контрасты не подходят для номинальных данных, таких как эта.
В самом общем смысле нам просто нужно установить уровни факторов в желаемом порядке. Если не указать, уровни фактора будут отсортированы в алфавитном порядке. Вы также можете указать порядок уровней в вызове фактора, как указано выше, также возможны и другие способы.
источник
within
, нет необходимости использоватьtheTable$Position
, и вы можете просто сделатьsort(-table(...))
для уменьшения порядка.-
вы используете, поскольку гораздо легче получить намерение,decreasing = TRUE
чем замечать это-
во всем остальном коде.levels(theTable$Position) <- c(...)
приводит к нежелательному поведению, в котором переупорядочиваются фактические записи фрейма данных, а не только уровни фактора. Смотрите этот вопрос . Может быть, вы должны изменить или удалить эти строки?levels<-
. Я собираюсь редактировать эту часть, по крайней мере, предварительно.levels<-()
сегодня. Это что-то из 8 лет назад, и я не могу вспомнить, были ли тогда другие вещи или я был просто неправ, но независимо от этого, это неправильно и должно быть стерто! Спасибо!@GavinSimpson:
reorder
это мощное и эффективное решение для этого:источник
ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
Используется
scale_x_discrete (limits = ...)
для указания порядка баров.источник
Я думаю, что уже предоставленные решения слишком многословны. Более краткий способ сделать полосу сортировки по частоте с помощью ggplot:
Это похоже на то, что предложил Алекс Браун, но немного короче и работает без какого-либо определения функции.
Обновить
Я думаю, что мое старое решение было хорошо в то время, но в настоящее время я бы предпочел использовать метод
forcats::fct_infreq
сортировки уровней факторов по частоте:источник
Как и
reorder()
в ответе Алекса Брауна, мы могли бы также использоватьforcats::fct_reorder()
. Он будет в основном сортировать факторы, указанные в 1-м аргументе, в соответствии со значениями во 2-м аргументе после применения указанной функции (по умолчанию = медиана, то, что мы здесь используем, так как просто имеем одно значение на уровень фактора).Жаль, что в вопросе OP требуемый порядок также в алфавитном порядке, так как это порядок сортировки по умолчанию при создании факторов, поэтому будет скрываться, что эта функция на самом деле делает. Чтобы было понятнее, я заменю «Вратарь» на «Зоокейпер».
источник
Простое переупорядочение факторов на основе dplyr может решить эту проблему:
источник
Вам просто нужно указать
Position
столбец как упорядоченный фактор, где уровни упорядочены по их количеству:(Обратите внимание, что
table(Position)
производит подсчет частотыPosition
столбца.)Тогда ваша
ggplot
функция будет показывать столбцы в порядке убывания количества. Я не знаю, есть ли возможностьgeom_bar
сделать это без явного создания упорядоченного фактора.источник
reorder()
что библиотека статистики выполняет ту же задачу.reorder()
в этом случае? Фактор, требующий переупорядочения, должен быть переупорядочен какой-либо функцией, и я изо всех сил пытаюсь найти хороший способ сделать это.with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))
это один способ, а другой,with(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))
но они такие же запутанные ...sort
а неorder
reorder
искусно делать. Я согласен на этот вопрос, что нужно что-то более сложное. Извините за путаницу.В дополнение к forcats :: fct_infreq, упомянутому @HolgerBrandl, есть forcats :: fct_rev, который меняет порядок факторов.
источник
Я согласен с Заком, что подсчет в dplyr является лучшим решением. Я обнаружил, что это самая короткая версия:
Это также будет значительно быстрее, чем переупорядочивание уровней факторов заранее, поскольку подсчет выполняется в dplyr, а не в ggplot или использовании
table
.источник
Если столбцы диаграммы взяты из числовой переменной, как показано в приведенном ниже кадре данных, вы можете использовать более простое решение:
Знак минус перед переменной сортировки (-Qty) контролирует направление сортировки (по возрастанию / убыванию)
Вот некоторые данные для тестирования:
Когда я нашел эту тему, это был ответ, который я искал. Надеюсь, это полезно для других.
источник
Еще одна альтернатива, использующая переупорядочение для упорядочения уровней фактора. В порядке возрастания (n) или в порядке убывания (-n) на основе количества. Очень похоже на использование
fct_reorder
изforcats
пакета:В порядке убывания
По возрастанию
Фрейм данных:
источник
Поскольку мы смотрим только на распределение одной переменной («Положение»), а не на отношение между двумя переменными , возможно, гистограмма была бы более подходящим графиком. У ggplot есть geom_histogram (), который упрощает:
Используя geom_histogram ():
Я думаю, что geom_histogram ( ) немного странно, так как обрабатывает непрерывные и дискретные данные по-разному.
Для непрерывных данных вы можете просто использовать geom_histogram () без параметров. Например, если мы добавим в числовой вектор «Оценка» ...
и использовать geom_histogram () в переменной «Score» ...
Для дискретных данных, таких как «Положение», мы должны указать вычисляемую статистику, вычисляемую эстетикой, чтобы получить значение y для высоты столбцов, используя
stat = "count"
:Примечание: любопытно и запутанно, вы также можете использовать
stat = "count"
для непрерывных данных, и я думаю, что это обеспечивает более эстетически приятный график.Изменения : расширенный ответ в ответ на полезные предложения DebanjanB .
источник
Я нахожу это очень раздражающим, что
ggplot2
не предлагает «автоматического» решения для этого. Вот почему я создалbar_chart()
функцию вggcharts
.По умолчанию
bar_chart()
сортирует бары и отображает горизонтальный график. Чтобы изменить этот наборhorizontal = FALSE
. Кроме того,bar_chart()
удаляет неприглядный «зазор» между стержнями и осью.источник