使用 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")
我需要制作一个图表(使用 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")