按一组的中位数重新排序分组箱线图

问题描述 投票:0回答:1

我有一个由 3 列组成的数据框:站点、程序、结果。这是一个最小的重现数据集:

> TP <- data.frame(Site = as.factor(c("Coal", "Coal", "Coal", "Coal", "STP", "STP", "STP", "STP")), 
                 Program = as.factor(c("D", "D", "H", "H", "D", "D", "H", "H")),
                 Result = c(0.65, 0.58, 0.15, 0.10, 0.55, 0.53, 0.48, 0.49))
> TP
   Site      Program                Result
   <fct>     <chr>                  <dbl>

 1 Coal      D                      0.65
 2 Coal      D                      0.58
 3 Coal      H                      0.15
 4 Coal      H                      0.10
 5 STP       D                      0.55 
 6 STP       D                      0.53
 7 STP       H                      0.48 
 8 STP       H                      0.49

实际上有 70000 行,由 50 个站点和两个程序组成。
我创建了一个 geom_boxplot,其中 x 变量是“结果”,y 变量是“站点”。对于每个站点,我有两个箱线图,其中包含来自两个不同程序(D 和 H)的数据。 Y 轴当前按特定站点的总体中位数排序,与程序无关。

> TP$Site <- reorder(TP$Site, TP$Result, FUN = median)
> ggplot(TP, aes(x = Result, y = Site)) + geom_boxplot(aes(fill = as.factor(Program)), outliers = FALSE)

我正在尝试更改图表,以便 Y 轴按计划 D 中位数最高的站点的降序排列。我仍然希望计划 H 中每个站点的相应箱线图紧邻计划箱线图下方D,我只想要按计划 D 排序的站点。有些站点仅具有来自计划 D 的数据,而且我理想情况下也希望它们在 y 轴上也适当排序,即使它们没有计划 H 的数据。

我在 Stack Overflow 上看到了很多使用 order、reorder 或arrange(dplyr) 的解决方案。我已经尝试了其中的一些建议,但没有成功。

我已在现有代码中成功使用“重新排序”(统计)来按结果的中位数对数据帧进行排序,但我无法为多个输入和订单复制该结果。然后我尝试使用“订单”(基础)来克服这个问题,但我无法想出多个订单的解决方案。然后我还尝试使用 dplyr 解决方案,结合使用 group_by、mutate 和arrange。我也无法让它工作。

在提供的重现数据集中,“STP”的总体中位数高于“煤炭”。但“煤炭”对于计划 D 具有较高的中位数,因此我希望“煤炭”位于箱线图的顶部。

非常感谢任何帮助。如果我可以提供更多信息,请告诉我。

r ggplot2 boxplot
1个回答
0
投票

一种选择是使用

ifelse
仅使用
Site
的值对
D
进行重新排序:

library(ggplot2)

ggplot(
  TP,
  aes(
    x = Result,
    y = reorder(
      Site,
      ifelse(Program == "D", Result, NA),
      FUN = median,
      na.rm = TRUE
    )
  )
) +
  geom_boxplot(
    aes(fill = Program),
    outliers = FALSE
  )

© www.soinside.com 2019 - 2024. All rights reserved.