如何在刻面ggplot2条形图中订购条形图

时间:2011-03-23 18:17:51

标签: r ggplot2 data-visualization bar-chart

如果我想从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 个答案:

答案 0 :(得分:14)

这是一个黑客:

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. 为所有条目(category2)
  2. 制作 UNIQUE 因子变量
  3. 根据高度重新排序变量
  4. 在变量上绘图:aes(x = category2)
  5. 使用scale_x_discrete中变量(category2)的原始值(类别)重新标记轴。

答案 1 :(得分:3)

这是一个实现你想要的黑客。我无法弄清楚如何获得刻度线下方的类别值。因此,如果有人可以帮助解决这个问题,那就太棒了。如果有效,请告诉我

# 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))