gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:00:00 24 4
gpt4 key购买 nike

我试图从同一个 data.frame 创建几个单独的图,每个图的 y 轴上的因子水平顺序不同。每个图都应该对 y 上的因子水平进行递减排序。

我知道这可以为每个图手动完成,但我正在寻找一种更有效和优雅的方法,因为我需要创建相当多的图。这不必包括使用facet_wrap,如果有另一种方式,也许是循环等?

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

获取数据集并按两个因子级别(清晰度和切割)聚合:
means <- diamonds %>%
group_by(clarity, cut) %>%
summarise(carat = mean(carat))

在这里,我通过一个因素重新排序,但最终我想为每个图单独重新排序(通过降低清晰度的平均值)。
means$clarity <- reorder(means$clarity, means$carat, FUN = mean)

使用 face_wrap 创建单独的图。使用 coord_flip 更轻松地比较绘图。
ggplot(means, aes(x = clarity, y = carat)) +
geom_col() +
facet_wrap(~cut, ncol = 1) +
coord_flip()

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

最佳答案

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

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

关于R:对几个单独的图重新排序因子水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47573036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com