R - 组订单/ ggplot 闪避条形图问题

R - Issues with group order/ ggplot dodge barchart

我查看了其他问题,但没有找到这个确切的问题

company<-c("c1","c1","c2","c2","c2","c3","c3","c3","c4","c4", "c4")
subsegment<- c("Sub2","Sub3", "Sub1","Sub2", "Sub3", "Sub1","Sub2", "Sub3", "Sub1","Sub2", "Sub3")
values<-c(120,300,30,300,1800,10,96,277, 10, 400, 1100)
df<- data.frame(company,subsegment, values)

这是我的数据框代码,我尝试制作分组条形图:

plot.1<- ggplot(df, aes(fill=company, y=values, x=subsegment)) + 
  geom_bar(position="dodge", stat="identity", alpha=0.5)

我得到的图正是我想要的,每个公司的值按 SubSegment 分组...除了默认按字母顺序“Sub1”、“Sub2”、“Sub3”从左到右排序的子部分公司也一样...

我希望显示相同的图形,但首先显示“Sub3”,然后显示“Sub1”,最后显示“Sub2” 我还希望每个组(每个子段内)内的条形图按值从大到小排序,而不是仅按字母顺序排列。

附上我得到的图表图片:

希望问题足够清楚,我想得到相同的图表,但改变 x 轴上事物的顺序

要重新排序 subsegment,请为其分配 factor 并在 levels 中指定订单。

要对闪避条形图中的条重新排序,请使用 reordervalues 的降序大小对闪避条进行排序。

library(tidyverse)

ggplot(df, aes(factor(subsegment, levels = c("Sub3", "Sub1", "Sub2")), 
               values, 
               fill = reorder(company, desc(values)))) + 
  geom_bar(position="dodge", stat="identity", alpha=0.5) +
  labs(x = "subsegment", fill = "company")

我是通过操纵底层数据来做到的。我喜欢在 ggplot 调用之外进行我所有的因素处理;我认为这会让事情变得更干净。哦因素的乐趣:

df<- data.frame(company,subsegment, values) %>%
  # subsegment order
  mutate(reorder_subsegment = case_when(
    subsegment == "Sub3" ~ 1,
    subsegment == "Sub1" ~ 2,
    subsegment == "Sub2" ~ 3
  )) %>% 
  mutate(subsegment = reorder(subsegment, reorder_subsegment)) %>% 
  # company order
  group_by(company) %>%
  mutate(company_by_value = sum(values)) %>%
  ungroup() %>% 
  mutate(company = reorder(company, -company_by_value))


ggplot(df, aes(fill=company, y=values, x=subsegment)) + 
  geom_col(position="dodge", alpha=0.5)