R:对几个单独的图重新排序因子水平

时间:2017-11-30 12:01:13

标签: r ggplot2 dplyr

我正在尝试从相同的data.frame创建几个单独的图,每个图的y轴上的因子级别的顺序不同。每个图都应该逐渐对y的因子级别进行排序。

我知道这可以针对每个情节手动完成,但我正在寻找一种更有效和更优雅的方式,因为我需要创建大量的情节。这不必包括使用facet_wrap,如果有另一种方式,可能有循环等?

onDataLoaded

采用数据集和聚合两个因子水平(清晰度和切割):

library(ggplot2)
library(dplyr)
data("diamonds")

这里我通过一个因素重新排序,但最终我想为每个图分别重新排序(通过降低清晰度)。

means <- diamonds %>%
group_by(clarity, cut) %>%
summarise(carat = mean(carat))

使用face_wrap创建单独的图。使用coord_flip可以更轻松地比较绘图。

means$clarity <- reorder(means$clarity, means$carat, FUN = mean)

您将看到这会为每种类型的切割创建单独的图,但y轴上的因子水平的顺序对于每种情况都不正确。如何正确订购它们而不必为每种类型的切割手动执行此操作?

1 个答案:

答案 0 :(得分:6)

这可以通过两个函数在一个图中完成:

reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
  new_x <- paste(x, within, sep = sep)
  stats::reorder(new_x, by, FUN = fun)
}


scale_x_reordered <- function(..., sep = "___") {
  reg <- paste0(sep, ".+$")
  ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}

可在github dgrtwo/drlib

上找到
ggplot(means, aes(x = reorder_within(clarity, carat, cut, mean), y = carat)) + 
  geom_col() + 
  scale_x_reordered() +
  facet_wrap(~cut,  scales = "free_y", ncol = 1) +
  coord_flip()

enter image description here