我有一个包含四个变量的数据集,用于测量受访者对不同主题的看法。我想将它们绘制到一个堆叠的条形图中,以便您可以比较不同主题之间的值。
这是数据集的第一行:
lebanon <- structure(list(climate_change = c(
"Not a very serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"A somewhat serious problem"
), air_quality = c(
"A somewhat serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"A very serious problem"
), water_polution = c(
"A somewhat serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"Not at all a serious problem"
), trash = c(
"A very serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"A somewhat serious problem"
)), row.names = c(NA, -6L), class = "data.frame")
我确实尝试过基于this site的以下代码:
lebanon %>%
filter(!is.na(climate_change), !is.na(air_quality), !is.na(water_polution), !is.na(trash)) %>%
gather(variable, value, climate_change:trash) %>%
ggplot(aes(x = variable, y = value, fill = value)) +
geom_bar(stat = "identity") +
coord_flip()
获取此图:
此图存在三个问题。
1。)条形图的长度不同。
2。)我不明白为什么在x轴指向y轴的位置写了一些东西。如何删除呢?
3。)我想对值进行排序以使它们有意义,因此我在之前对它们进行了排序:
dataset$climate_change <- factor(dataset$climate_change, levels = c("Not at all a serious problem",
"Not a very serious problem",
"A somewhat serious problem",
"A very serious problem"))
dataset$air_quality <- factor(dataset$air_quality, levels = c("Not at all a serious problem",
"Not a very serious problem",
"A somewhat serious problem",
"A very serious problem"))
dataset$water_polution <- factor(dataset$water_polution, levels = c("Not at all a serious problem",
"Not a very serious problem",
"A somewhat serious problem",
"A very serious problem"))
但是这些值仍然是无序的。我究竟做错了什么?还是有一种更有效的方法来制作多个堆叠的条形图?
答案 0 :(得分:0)
cour代码的主要问题是您在value
上映射了y
,即因数var。此外,您可以简单地使用drop_na
而不是过滤器,并且可以简单地使用聚集之后的值级别,而不是为每个变量重复该值。 (;试试这个:
顺便说一句:请使用dput()
将您的数据放入信息中,例如dput(head(lebanon))
。查看我对您的帖子的修改。与回答问题相比,花费了更多时间来清理并正确处理数据。 (;
**编辑**为了使条形图按需要的顺序排序,我使用了forcats
包。首先,我add_count
认为该问题是“一个非常严重的问题”的人数。然后,我fct_reorder
variable
相应地,即-n
使其下降。为了颠倒value
的顺序,我使用了fct_rev
。
lebanon <- structure(list(climate_change = c(
"Not a very serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"A somewhat serious problem"
), air_quality = c(
"A somewhat serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"A very serious problem"
), water_polution = c(
"A somewhat serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"Not at all a serious problem"
), trash = c(
"A very serious problem",
"Not a very serious problem", NA, NA, "A very serious problem",
"A somewhat serious problem"
)), row.names = c(NA, -6L), class = "data.frame")
library(tidyverse)
lebanon %>%
drop_na() %>%
gather(variable, value, climate_change:trash) %>%
add_count(variable, value == "A very serious problem") %>%
mutate(value = factor(value, levels = c("Not at all a serious problem",
"Not a very serious problem",
"A somewhat serious problem",
"A very serious problem"))) %>%
ggplot(aes(x = forcats::fct_reorder(variable, -n), fill = forcats::fct_rev(value))) +
geom_bar() +
coord_flip()