I want to plot a bar chart and order the x axis by value. I know that I managed to do that before, but I might have deleted that code somewhere. I have been stuck on that now for a while, so I'm asking you now.
As my dataframe contains more than 24,000 rows, here a sample data. I hope that it is enough to recreate it.
structure(list(country = c("Palestine", "Iraq", "Algeria", "Libya",
"Lebanon", "Jordan", "Egypt", "Palestine", "Libya", "Egypt",
"Libya", "Jordan", "Yemen", "Jordan", "Tunesia", "Iraq", "Lebanon",
"Lebanon", "Morocco", "Algeria", "Jordan", "Egypt", "Kuwait",
"Morocco", "Tunesia", "Palestine", "Yemen", "Lebanon", "Sudan",
"Lebanon", "Libya", "Palestine", "Yemen", "Tunesia", "Sudan",
"Yemen", "Morocco", "Jordan", "Palestine", "Palestine", "Libya",
"Palestine", "Libya", "Jordan", "Jordan", "Lebanon", "Iraq",
"Algeria", "Yemen", "Tunesia", "Lebanon", "Libya", "Yemen", "Egypt",
"Yemen", "Libya", "Palestine", "Egypt", "Tunesia", "Sudan", "Tunesia",
"Egypt", "Lebanon", "Iraq", "Kuwait", "Libya", "Tunesia", "Algeria",
"Morocco", "Egypt", "Tunesia", "Morocco", "Palestine", "Kuwait",
"Morocco", "Kuwait", "Morocco", "Palestine", "Morocco", "Lebanon",
"Iraq", "Egypt", "Morocco", "Algeria", "Jordan", "Sudan", "Sudan",
"Algeria", "Sudan", "Egypt", "Palestine", "Jordan", "Sudan",
"Iraq", "Egypt", "Tunesia", "Sudan", "Yemen", "Lebanon", "Iraq"
), female_head_gov = structure(c(3L, 3L, 4L, 3L, 2L, 2L, 4L,
2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 1L, 3L, 2L, 3L, 3L, 1L, 1L, 3L,
3L, 4L, 2L, 4L, 2L, 1L, 2L, 3L, 2L, 2L, 3L, 3L, 3L, 5L, 2L, 2L,
4L, 2L, 4L, 2L, 4L, 3L, 2L, 1L, 4L, 3L, 2L, 2L, 2L, 2L, 1L, 3L,
2L, 2L, 2L, 2L, 3L, 5L, 1L, 1L, 1L, 2L, 2L, 4L, 2L, 2L, 3L, 2L,
4L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 3L, 2L, 4L, 1L, 2L,
3L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 3L, 3L, 1L, 1L), .Label = c("I strongly agree",
"I agree", "I disagree", "I strongly disagree", "Don't know"), class = "factor")), class = "data.frame", row.names = c(NA,
-100L))
I tried the following code using forcats::fct_reorder, but it doesn't give me the desired outcome:
dataset %>%
group_by(country) %>%
filter(!is.na(female_head_gov), female_head_gov != "Don't know") %>%
mutate(female_head_gov = fct_collapse(female_head_gov,
`Agree/strongly agree` = c("I strongly agree", "I agree"),
`Disagree/strongly disagree` = c("I disagree", "I strongly disagree"))
) %>%
count(female_head_gov) %>%
mutate(prop = n / sum(n)) %>%
ggplot(aes(fct_reorder(country, prop), prop, fill = female_head_gov)) +
geom_col(position = "fill")
I also tried this without calculating the proportions, but then I don't have variable to order the country variable with.
dataset %>%
group_by(country) %>%
filter(!is.na(female_head_gov), female_head_gov != "Don't know") %>%
mutate(female_head_gov = fct_collapse(female_head_gov,
`Agree/strongly agree` = c("I strongly agree", "I agree"),
`Disagree/strongly disagree` = c("I disagree", "I strongly disagree"))
) %>%
ggplot(aes(country, fill = female_head_gov)) +
geom_bar(position = "fill")
Any ideas what I'm doing wrong? If you have any tips how to create such a bar chart more efficient, just let me know. :)