我有一个由 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 具有较高的中位数,因此我希望“煤炭”位于箱线图的顶部。
非常感谢任何帮助。如果我可以提供更多信息,请告诉我。
一种选择是使用
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
)