Вопрос или проблема
Я пытаюсь создать столбчатую диаграмму, показывающую согласие с определенной темой в зависимости от политической принадлежности людей. Я хочу, чтобы каждую переменную политической принадлежности представляли два столбца: один для процента людей внутри этой принадлежности, которые согласны, и другой для тех, кто не согласен. Затем внутри каждого столбца я хочу, чтобы данные были сгруппированы по сильному или частичному согласию и несогласию. Вот код:
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()
для отдельных визуализаций, если это не нарушает общий замысел.
Надеюсь, эти рекомендации помогут вам создать график, который будет показывать всю необходимую информацию о согласии в зависимости от политической принадлежности.