我试图使用ggplot2创建一个堆叠的条形图,通过多个标准进行排序。以下是我正在使用的数据框架-----------------------------------------------。
my_df<-data.frame('sub_n'=c(rep(1,3),rep(2,3),rep(3,3),rep(4,3),rep(5,3)),'total'=c(1, 3, 3, 2, 1, 2, 1, 3, 3, 1, 3, 1, 3, 1, 3),'choice'=c(rep(c('a','b','c'),5)))
我最终希望得到的是一个堆叠的条形图,根据 "选择 "的数量进行排序。具体来说,我想创建一个横向的堆叠图,顶部的条形图有最高的 "总 "选择值==b,接着是最高的 "总 "选择值==c,然后是最高的 "总 "选择值==a。
这是我目前尝试做的事情--。
require(dplyr)
require(forcats)
my_df<-my_df %>%
arrange(choice, desc(total)) %>%
mutate(choice=fct_reorder(choice,total))
order_1<-unique(my_df$sub_n)
my_df$sub_n<-factor(my_df$sub_n, levels=order_1)
my_df <- my_df[order(my_df$sub_n),]
ggplot(data=my_df, aes(x=sub_n, y=total, fill=choice))+
geom_bar(position="stack",stat="identity")+
coord_flip()
我甚至不知道我的解释是否正确,如果有其他的东西我可以加入使其更清楚,请告诉我。
这个在我看来是出奇的棘手。这里有一个方法,使用 arrange
按条件排序,然后 row_number()
来设置等级。感谢@akrun在 本回答 的灵感。
我们可以用 pivot_wider
使得每个变量都能轻松排序。
一旦我们设置好了行列,我们就可以回到数据上,用以下方法对因子重新排序 fct_reorder
就像你在尝试中做的那样。
如果你想重新排列因素在条形图中的位置,你可以使用 fct_relevel
.
library(dplyr)
library(tidyr)
library(forcats)
library(ggplot)
my_df %>%
pivot_wider(names_from = "choice", values_from = "total") %>%
arrange(desc(b),desc(c),desc(a)) %>%
mutate(rank = row_number()) %>%
right_join(my_df,by = "sub_n") %>%
mutate(sub_n = fct_reorder(as.factor(sub_n), desc(rank)),
choice = fct_relevel(choice,c("a","c","b"))) %>%
ggplot(aes(x=sub_n, y=total, fill=choice))+
geom_bar(position="stack",stat="identity")+
scale_fill_manual(values = c(b = "#00BA38", c = "#619CFF", a = "#F8766D")) +
coord_flip()