library(tidyverse)
dat <- read.table(text = "A B C
1 23 234 324
2 34 534 12
3 56 324 124
4 34 234 124
5 123 534 654",
sep = "",
header = TRUE) %>%
gather(key = "variable", value = "value") %>%
group_by(variable) %>%
mutate(ind = as.factor(rep(1:5)),
perc = value / sum(value))
ggplot(dat, aes(variable, perc, fill = ind)) +
geom_col() +
scale_y_continuous(labels = scales::percent_format()) +
facet_grid(~ variable, scales = "free_x") +
theme(axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank())
上面的代码创建了堆叠的条形构面,您也可以在上面看到。每个条形图的ind
部分的顺序与图例上显示的顺序相同。
我更希望每个ind
部分都以升序(或降序)放置。我通常要感谢@dgrtwo和reorder_within函数。
reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
new_x <- paste(x, within, sep = sep)
stats::reorder(new_x, by, FUN = fun)
}
但是-在我的情况下使用它可以将上面堆积的条形图分解成下面的分解图。如何保持堆积的条形图,并对每个ind
进行升序或降序排序?
注意-这可能不是其他几个“方面重新排序”问题的重复。我找不到与堆叠条形图有关的问题,以及我在上面描述的问题。
ggplot(dat,
aes(reorder_within(ind, value, variable), perc, fill = ind)) +
geom_col() +
scale_y_continuous(labels = scales::percent_format()) +
facet_grid(~ variable, scales = "free_x") +
theme(axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank())
答案 0 :(得分:1)
经过一些操作,this answer变为
<transition-group>
与链接的答案相比,我主要对行进行排序并添加dat <- dat %>% arrange(variable, -perc) %>% mutate(ordering = row_number())
aux <- with(dat, match(sort(unique(ind)), ind))
ggplot(dat, aes(x = variable, y = perc, fill = interaction(-ordering, variable))) +
geom_col() + facet_grid(~ variable, scales = "free_x") +
scale_fill_manual("ind", values = scales::hue_pal()(5)[dat$ind],
labels = with(dat, ind[aux]),
breaks = with(dat, interaction(-ordering, variable)[aux])) +
theme(axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank()) +
scale_y_continuous(labels = scales::percent_format())
。为了恢复默认调色板,我还使用了ordering
中的hue_pal
。由于使用了scales
,因此需要这样做,在这种情况下,需要手动提供颜色。