(重新发布-以前被标记为重复,但其他MRE可以更全面地说明问题)
我正在尝试按堆积百分比条形图中的一个因素的百分比值排序该因素之一,但无法设法解决。
例如在下面的内容中,我希望按因子x
的百分比值对q
中的类别进行排序。
library(tibble)
library(ggplot2)
df <- tibble(x = rep(LETTERS[1:5], 2), y = c(10,20,5,60,30,90,80,95,40,70), z = c(rep("p", 5), rep("q", 5)))
ggplot(df, aes(x = x, y = y, fill = z)) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels=scales::percent)
在问题Reorder bars in geom_bar ggplot2上接受的解决方案使用reorder()
来更改x条的顺序,但不适用于我的情况:
ggplot(df, aes(x = reorder(x, -y), y = y, fill = z)) +
geom_bar(stat = "identity", position = "fill") +
scale_y_continuous(labels=scales::percent)
产生与上述完全相同的图。
我认为原因是数据采用整洁的格式,因此x的y值多个,但我不知道如何仅将y的子集映射到x。
答案 0 :(得分:2)
首先定义级别如何?
df %>%
filter(z == "q") %>%
mutate(x = factor(x, levels = x[order(y)])) %>%
pull(x) %>%
levels -> x_levels
,然后将这些级别用作ggplot的输入:
df %>%
mutate(x = factor(x,
levels = x_levels)) %>%
ggplot(aes(x = x,
y = y,
fill = z)) +
geom_bar(stat = "identity",
position = "fill") +
scale_y_continuous(labels = scales::percent)
另一种方法是使用两个附件功能:
在github dgrtwo/drlib上可用
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), ...)
}
ggplot(df, aes(x = reorder_within(x, y, 1, fun = max),
y = y,
fill = z)) +
geom_bar(stat = "identity",
position = "fill") +
scale_y_continuous(labels = scales::percent)+
scale_x_reordered()
我在组内使用了1,但是这些功能允许使用more complicated sort within each facet。
或:
ggplot(df, aes(x = reorder_within(x, y, 1, fun = min),
y = y,
fill = z)) +
geom_bar(stat = "identity",
position = "fill") +
scale_y_continuous(labels = scales::percent)+
scale_x_reordered()