如何正确按中位数排序面板箱线图?

5

我正在使用R中附带的“diamonds”数据集。当尝试按照价格中位数对“color”因子进行排序时,无法正常工作。

这就是我的结果:

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

它给了我这个(完全没有排序):enter image description here

我是不是做错或遗漏了什么?


你是否已经在这里查看:https://dev59.com/gKTia4cB1Zd3GeqP_1S_? - Hardik Gupta
我有尝试过,但没能让它正常工作。 - filipetrm
预期结果是什么? - clemens
2个回答

12

这里提供了一个相对简单的方法来实现所请求的排列,使用两个可用的辅助函数这里

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

这里输入图片描述

使用ylim(0, 5500)将删除大量数据,导致不同的箱线图干扰任何以前定义的顺序。如果您想限制某个轴而不这样做,最好使用:

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

这将导致:

在此输入图片描述

如果您确实打算删除大量数据并保持排列,则应在绘制图表之前对数据进行过滤:

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

输入图像描述


1
这是一个很好的解决方案。在我的情况下它一度不起作用。我花了一些时间才意识到我的数据中的NA影响了计算。我在第一个辅助函数中添加了FUN = function(x) fun(x, na.rm=T) :) - Matias Andina
你能否请看一下我的问题?https://stackoverflow.com/questions/65547448/r-for-the-same-code-labels-q1-median-appear-on-one-computer-but-dont-appea 谢谢! - stats_noob

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)

但是来自missuse的答案非常好。


你能否请看一下我的问题?https://stackoverflow.com/questions/65547448/r-for-the-same-code-labels-q1-median-appear-on-one-computer-but-dont-appea 谢谢。 - stats_noob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接