В R с использованием ggplot2 как использовать “dodge” по одному переменному и “stack” с использованием отдельного переменного.

Вопрос или проблема

Я пытаюсь создать столбчатую диаграмму, показывающую согласие с определенной темой в зависимости от политической принадлежности людей. Я хочу, чтобы каждую переменную политической принадлежности представляли два столбца: один для процента людей внутри этой принадлежности, которые согласны, и другой для тех, кто не согласен. Затем внутри каждого столбца я хочу, чтобы данные были сгруппированы по сильному или частичному согласию и несогласию. Вот код:

df_grouped_partisanship_issue <- data %>%
  group_by(partisanship_with_leaners) %>%
  count(issue, name = "count")

df_grouped_partisanship_issue <- df_grouped_partisanship_issue %>%
  group_by(`partisanship_with_leaners`) %>%
  mutate(percent = (`count` / sum(`count`)) * 100) %>%
  ungroup() %>%
  filter(!is.na(issue))

df_grouped_partisanship_issue <- df_grouped_partisanship_issue %>%
  mutate(agreement_category = ifelse(grepl("Agree", issue), "Agree", "Disagree"))

df_grouped_partisanship_issue $partisanship_with_leaners <- factor(df_grouped_partisanship_issue$`partisanship_with_leaners`,
                                                                                 levels = partisanship_order)
df_grouped_partisanship_issue$issue <- factor(df_grouped_partisanship_issue$issue,
                                                                         levels = agreement_order)
df_grouped_partisanship_issue$agreement_category <- factor(df_grouped_partisanship_issue$agreement_category, levels = c("Agree", "Disagree"))

ggplot(df_grouped_partisanship_issue,
       aes(x=partisanship_with_leaners, y=`percent`, fill=`issue`, group = agreement_category)) +
  ylim(0,100) +
  geom_bar(stat = "identity", position = position_dodge(width=0.9)) +
  labs(x="Partisanship", y="Percent", title="Agreement on issue aligned with partisanship") +
  scale_fill_manual(values = c("Agree Strongly" = "#4CAF50", "Agree Somewhat" = "#8BC34A", "Disagree Somewhat" = "#FF5722", "Disagree Strongly" = "#F44336")) +
  theme_minimal(base_size = 14)   # Установить базовый размер шрифта и тему

Это результирующий график. Большая часть данных обрезана, и я не могу понять, почему данные обрезаются. Для каждой категории по оси X два столбца должны складываться в 100%.
Результат графика

Это датафрейм. Он содержит все правильные данные, поэтому проблема заключается в создании графика.
введите описание изображения здесь

Я пытался обратиться за помощью к ChatGPT, но он не смог помочь, и, честно говоря, у меня нет представления о том, с чего начинать искать решения. Я видел, как люди используют facet_wrap и grid, но это разделяет партийные переменные, а я хочу, чтобы они были связаны, чтобы можно было быстро увидеть различия в согласии и несогласии. Буду очень признателен за любую помощь.

Ответ или решение

Для создания графика с использованием библиотеки ggplot2 в R, который показывает уровень согласия по определенной теме среди людей с различными политическими убеждениями, необходимо учитывать несколько деталей. В вашем случае вам нужно визуализировать два столбца для каждой категории политической принадлежности: один для процента людей, согласных с темой, и другой для тех, кто не согласен. Каждая из этих категорий затем должна быть разбита на подкатегории, такие как "Сильно согласен", "Согласен несколько", "Несколько не согласен" и "Сильно не согласен".

Однако вы столкнулись с проблемой визуализации, где данные обрезаются, и необходимо убедиться, что график корректно отображает все данные. Вот как можно решить вашу задачу.

1. Подготовка данных

Поскольку вы подготовили данные, объединяя их в группы и вычисляя процент согласия, убедитесь, что вы правильно создали категории согласия. Кроме того, не забудьте, что переменная issue должна быть разделена на две подкатегории: согласные и не согласные.

2. Использование функции geom_bar

Вы правильно начали с функции geom_bar. Однако, чтобы объединить дождество и стековые графики, вам нужно будет использовать position = position_dodge() для дождественного отображения и добавить geom_bar() для стекового отображения. Чтобы достичь вашего результата, можно использовать два отдельных вызова geom_bar().

3. Пример кода

Обратите внимание на следующую реализацию:

library(ggplot2)
library(dplyr)

# Подготовка данных
df_grouped_partisanship_issue <- data %>%
  group_by(partisanship_with_leaners) %>%
  count(issue, name = "count") %>%
  group_by(partisanship_with_leaners) %>%
  mutate(percent = (count / sum(count)) * 100) %>%
  ungroup() %>%
  filter(!is.na(issue)) %>%
  mutate(agreement_category = ifelse(grepl("Agree", issue), "Agree", "Disagree"))

df_grouped_partisanship_issue$partisanship_with_leaners <- factor(df_grouped_partisanship_issue$partisanship_with_leaners, levels = partisanship_order)
df_grouped_partisanship_issue$issue <- factor(df_grouped_partisanship_issue$issue, levels = agreement_order)
df_grouped_partisanship_issue$agreement_category <- factor(df_grouped_partisanship_issue$agreement_category, levels = c("Agree", "Disagree"))

# Построение графика
ggplot(df_grouped_partisanship_issue, aes(x = partisanship_with_leaners, y = percent, fill = issue)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  labs(x = "Partisanship", y = "Percent", title = "Agreement on issue aligned with partisanship") +
  scale_fill_manual(values = c("Agree Strongly" = "#4CAF50", "Agree Somewhat" = "#8BC34A", "Disagree Somewhat" = "#FF5722", "Disagree Strongly" = "#F44336")) +
  theme_minimal(base_size = 14) +
  ylim(0, 100) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Поворот меток на оси x для улучшения читаемости

4. Устранение срезов

Если у вас данные обрезаются, убедитесь:

  • Все названия переменных правильно указаны.
  • Данные по-прежнему загружаются без пропусков.
  • Проверка пространства между барными графиками, изменяя параметр width в position_dodge().
  • Настройка пределов оси y с помощью функции ylim().

5. Дополнительные советы

Если вы продолжаете испытывать трудности, вы можете попробовать:

  • Изменить размер графика или его шрифт, чтобы избежать вырезки информации.
  • Использовать facet_wrap() для отдельных визуализаций, если это не нарушает общий замысел.

Надеюсь, эти рекомендации помогут вам создать график, который будет показывать всю необходимую информацию о согласии в зависимости от политической принадлежности.

Оцените материал
Добавить комментарий

Капча загружается...