ggplot的多个堆积条形图

时间:2020-06-16 14:37:37

标签: r ggplot2 tidyverse

我有一个包含四个变量的数据集,用于测量受访者对不同主题的看法。我想将它们绘制到一个堆叠的条形图中,以便您可以比较不同主题之间的值。

这是数据集的第一行:

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()

获取此图:

enter image description here

此图存在三个问题。

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"))

但是这些值仍然是无序的。我究竟做错了什么?还是有一种更有效的方法来制作多个堆叠的条形图?

1 个答案:

答案 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()