Сортировать столбцы по значению y - PullRequest
1 голос
/ 06 мая 2020

У меня есть набор данных с двумя переменными:

  • district: коэффициент с 26 уровнями (A, B, C, D et c.)
  • type: «x», «o» (коэффициент)

Теперь я хотел бы построить гистограмму с накоплением: одна полоса на каждый год.

ggplot(aes(x = district, fill=type), data=dat) + geom_bar()

Моя проблема в том, что столбцы должны быть в порядке возрастания (от общего количества каждого района). Вот так:

  |
  |  x
  |  x
  |  x  x
n |  o  x  x
  |  o  o  o
  |  o  o  o  x
  |  o  o  o  o 
  _______________
     A  C  G  B …

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Если ваш data.frame состоит только из двух столбцов с уровнями, выполните:

library(ggplot2)
set.seed(111)
df = data.frame(district=sample(LETTERS[1:4],100,replace=TRUE),
type=sample(c("x","o"),100,replace=TRUE))

head(df)

  district type
1        B    x
2        C    o
3        D    x
4        C    x
5        C    x
6        A    x

ggplot(df,aes(x=reorder(district,district,function(i)-length(i)),fill=type)) + 
geom_bar() + xlab("district")

enter image description here

Краткое объяснение, reorder() может использоваться для рефакторинга одной переменной в соответствии с другой, а также позволяет применять функцию. В этой ситуации нам просто нужно посчитать номер каждого уровня в районе, поэтому length() будет работать. Второй district просто пустышка

3 голосов
/ 06 мая 2020

Вот пример ваших данных:

district <- sample(LETTERS, 1000, replace = TRUE)
xo <- c("x","o")
type <- sample(xo, 1000, replace = TRUE)

Вот ваш df. Вам нужно создать столбец count, по которому вы можете упорядочить свои районы.

library(tidyverse)

df <- as.data.frame(cbind(district, type)) %>%
  group_by(district) %>%
  mutate(count = n())

В аргументе aes вы можете указать reorder район по убыванию количества:

ggplot(df, aes(x = reorder(district, -count), fill=type)) +
  geom_bar()

И если вы не хотите изменять свой df путем группировки или добавления переменной count, вы можете сделать это:

df %>%
  group_by(district) %>%
  mutate(count = n()) %>%
  ggplot(aes(x = reorder(district, -count), fill=type)) +
  geom_bar()

...