ggplot2 - 如何根据分类和数字变量对堆积条进行排序。

问题描述 投票:1回答:1

我试图使用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()

Plot

我甚至不知道我的解释是否正确,如果有其他的东西我可以加入使其更清楚,请告诉我。

r ggplot2 data-visualization stacked-chart
1个回答
0
投票

这个在我看来是出奇的棘手。这里有一个方法,使用 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()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.