Как заказать бары на гистограмме ggplot2 - PullRequest
8 голосов
/ 23 марта 2011

Если я хочу упорядочить столбцы в диаграмме ggplot2 от наибольшего к наименьшему, то я обычно обновляю уровни факторов в категории столбцов, например,

one_group <- data.frame(
  height   = runif(5),
  category = gl(5, 1)
)

o <- order(one_group$height, decreasing = TRUE)
one_group$category <- factor(one_group$category, levels = one_group$category[o])

p_one_group <- ggplot(one_group, aes(category, height)) +
  geom_bar(stat = "identity")
p_one_group

Если у меня есть несколько групп диаграмм, которые я бы хотел иметь в разных фасетах, причем у каждого фасета есть столбцы, упорядоченные от наибольшего к наименьшему (и разные оси X), тогда метод ломается.

Учитывая некоторые данные образца

two_groups <- data.frame(
  height   = runif(10),
  category = gl(5, 2),
  group    = gl(2, 1, 10, labels = letters[1:2])
)

и код построения

p_two_groups <- ggplot(two_groups, aes(category, height)) +
  geom_bar(stat = "identity") +
  facet_grid(. ~ group, scales = "free_x")
p_two_groups

что мне нужно сделать, чтобы правильно расположить планку?

Если это поможет, то эквивалентная проблема, которую нужно решить: как мне обновить уровни факторов после того, как я выполнил огранку?

Ответы [ 2 ]

14 голосов
/ 24 марта 2011

вот хак:

two_groups <- transform(two_groups, category2 = factor(paste(group, category)))
two_groups <- transform(two_groups, category2 = reorder(category2, rank(height)))

ggplot(two_groups, aes(category2, height)) +
  geom_bar(stat = "identity") +
  facet_grid(. ~ group, scales = "free_x") +
  scale_x_discrete(labels=two_groups$category, breaks=two_groups$category2)
  1. make UNIQUE фактор-переменная для всех записей (категория2)
  2. изменить порядок переменных в зависимости от высоты
  3. график зависимости от переменной: aes (x = category2)
  4. повторно пометить ось, используя исходное значение (категорию) для переменной (категория2) в scale_x_discrete.
3 голосов
/ 23 марта 2011

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

# add a height rank variable to the data frame
two_groups = ddply(two_groups, .(group), transform, hrank = rank(height));

# plot the graph

p_two_groups <- ggplot(two_groups, aes(-hrank, height)) +
  geom_bar(stat = "identity") +
  facet_grid(. ~ group, scales = "free_x") +
  opts(axis.text.x = theme_blank()) +
  geom_text(aes(y = 0, label = category, vjust = 1.5))
...