使用 forcats 包中的 fct_relevel() 将 ggplot2 中的变量重新排序不止一个级别

Reorder variables in ggplot2 by more than one level using fct_relevel() from forcats package

我需要制作一个图表(使用 ggplot2)按不同类别的值组织条形图。如果您在下面看到,我可以按第一级(“非常重要”)排序,但我无法获得第二级(“重要”)以正确组织 - 例如:'Passion for farming' 应该结束在 'Cultivating a healthy workplace'.

以上
library(ggplot2)
library(dplyr)
library(forcats)
library(reshape)

data<- data.frame(Category=c("Open attitude","Flexible","Interest in learning","Passion for farming",
                           "Dependable business networks","Community ties", "Reliable crew",
                           "Family support", "Responsive government", "Protect natural resources and biodiversity",
                           "Build healthy soil", "Diversify farm products", "Minimize external inputs",
                           "Water-use efficiency", "Effective planning and monitoring", "Cultivating a healthy workplace",
                           "Diversifying markets and venues", "Focusing on recurrent customers",
                           "Appropriate equipment and infrastructure", "Financial leeway and capacity"),
                     Very.important=c(78.57,85.71,85.71,92.86,100.00,85.71,78.57,64.29,50.00,57.14,
                                      100.00,64.29,57.14,57.14,78.57,92.86,71.43,71.43,64.29,71.43),
                  Important=c(21.43,14.29,14.29,7.14,0.00,14.29,21.43,35.71,21.43,35.71,
                              0.00,35.71,28.57,35.71,21.43,0.00,14.29,7.14,28.57,21.43),
                  Slightly.important=c(0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,28.57,7.14,
                  0.00,0.00,14.29,7.14,0.00,7.14,14.29,21.43,7.14,7.14),
                  Not.important=c(0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,
                                  0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00))
data 
alldata <- melt(data)

首先,为了在新的 data.frame 中组织变量,我使用了 forcats 包中的 fct_relevel()。然而,即使我在 arrange 函数中添加 'Important' 作为第二层,它也没有被识别。该图结果与我在函数中仅包含 'Very Important' 相同。

alldata1 = alldata %>%
  ungroup() %>%
  arrange(fct_relevel(variable, "Very.important"), value) %>%
  mutate(Category= fct_inorder(Category))

我附上了图表代码供您参考。

mycolors <- c('#0570b0','#74a9cf','#bdc9e1','#f1eef6')

ALLres <- ggplot(data = alldata1, aes(x =Category, y = value, fill = variable)) +
  labs(y="Percentage", x = "") +
  geom_col(width = 0.7, position = position_stack(reverse = T)) +
  coord_flip() +
  theme_bw() +
  theme(text = element_text(size = rel(3), colour = "black"), # x-label
        axis.text.y = element_text(size = rel(3.5), colour = "black"),
        axis.text.x = element_text(size = rel(3), colour = "black")) +
  theme(legend.text = element_text(size = rel(3))) + #legend size
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  theme(legend.position="bottom") +
  scale_fill_manual (values=mycolors,  
                     name = "Response",
                     labels = c("Very Important", "Important",
                                "Slightly Important", "Not Important"))
ALLres

提前致谢!

您可以先 arrange Very.important 上的数据,然后 Important 并分配 Category 列的因子水平。

library(tidyverse)

mycolors <- rev(c('#0570b0','#74a9cf','#bdc9e1','#f1eef6'))

data %>%
  arrange(Very.important, Important) %>%
  mutate(Category = factor(Category, Category)) %>%
  pivot_longer(cols = -Category) %>%
  ggplot(aes(x=Category, y = value, fill = name)) +
  labs(y="Percentage", x = "") +
  geom_col(width = 0.7) +
  coord_flip() +
  theme_bw() +
  theme(text = element_text(size = rel(3), colour = "black"), # x-label
        axis.text.y = element_text(size = rel(3.5), colour = "black"),
        axis.text.x = element_text(size = rel(3), colour = "black")) +
  theme(legend.text = element_text(size = rel(3))) + #legend size
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  theme(legend.position="bottom") + 
  scale_fill_manual (values=mycolors,  
                     name = "Response")