如何通过中位数正确地对分面箱图进行排序?

时间:2017-11-03 07:15:26

标签: r ggplot2

我正在使用R附带的'钻石'数据集。当尝试根据价格中位数对“颜色”因素进行排序时,它将无效。

这就是我得到的:

ggplot(diamonds, aes(x = reorder(color, -price, FUN=median), y = price)) + 
  geom_boxplot() + 
  facet_wrap(~cut) + 
  ylim(0, 5500)

它给了我(根本没有排序): enter image description here

我有错误或遗失的事吗?

2 个答案:

答案 0 :(得分:7)

这是使用两个辅助函数here

实现请求排列的一种相对简单的方法
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), ...)
}

library(tidyverse)
data(diamonds)

p <- ggplot(diamonds, aes(x = reorder_within(color, price, cut, median), y = price)) + 
  geom_boxplot(width = 5) + 
  scale_x_reordered()+
  facet_wrap(~cut,  scales = "free_x")

enter image description here

使用ylim(0, 5500)将删除大部分数据,从而导致不同的箱形图,这将干扰任何以前定义的订单。如果您希望限制轴而不这样做,最好使用:

p + coord_cartesian(ylim = c(0, 5500))

这导致:

enter image description here

如果您真的打算删除大部分数据并保留安排,请在图之前过滤数据:

diamonds %>%
  filter(price < 5500) %>%
  ggplot(aes(x = reorder_within(color, price, cut, median), y = price)) + 
  geom_boxplot(width = 5) + 
  scale_x_reordered()+
  facet_wrap(~cut,  scales = "free_x")

enter image description here

答案 1 :(得分:0)

ggplot(diamonds, aes(x = reorder(color, -price, FUN=median), y = price)) + 
      geom_boxplot() + 
      facet_wrap(~cut) + 
      ylim(0, 5500)
  levels(diamonds$color) # "D" "E" "F" "G" "H" "I" "J"
  diamonds$color <- reorder(diamonds$color, -diamonds$price, FUN=median)
  levels(diamonds$color)  # "J" "I" "H" "F" "G" "D" "E"
  ggplot(diamonds, aes(x =color, y = price))+
      geom_boxplot() + 
      facet_wrap(~cut) + 
      ylim(0, 5500)

实际上你有以下订单

  ggplot(diamonds, aes(x =color, y = price))+
      geom_boxplot() + 
      ylim(0, 5500)

但错过的答案非常好。