Гистограмма с несколькими накоплениями и ggplot - PullRequest
0 голосов
/ 16 июня 2020

У меня есть набор данных с четырьмя переменными, измеряющими точку зрения респондентов по различным темам. Я хочу нанести их на одну столбчатую диаграмму с накоплением, чтобы вы могли сравнить значения по разным темам.

Это первые строки набора данных:

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

Я пробовал использовать следующий код основан на этом сайте :

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 голосов
/ 16 июня 2020

Основная проблема с кодом Cour состоит в том, что вы сопоставили value, то есть фактор var, на y. Кроме того, вы можете просто использовать drop_na вместо фильтра и просто указать уровни значений после сбора вместо того, чтобы повторять его для каждой переменной. (; Попробуйте это:

Кстати: поместите свои данные в сообщение с помощью dput(), например, dput(head(lebanon)). См. Мои изменения в своем сообщении. На очистку и получение данных потребовалось больше времени, чем на ответ на question. (;

** EDIT ** Чтобы упорядочить слитки в желаемом порядке, я использую пакет 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()

...