ggplot2 с параллельным и пропорциональным заполнением

#r #ggplot2 #bar-chart #fill

#r #ggplot2 #гистограмма #заполнение

Вопрос:

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

Моя цель — иметь сетку столбчатой диаграммы следующим образом: каждый график будет специфичен для 1 группы race_ethnicity. Ось x на каждом графике будет представлять собой разные группы age_bin. Для каждого age_bin будет два столбца: 1 для мужчин и 1 для женщин. Для каждого столбца я хочу, чтобы он был заполнен пропорцией вероятного / (Маловероятного вероятного). Предпочтительно, чтобы каждая полоса имела высоту 1 и пересекала ее линией, поэтому, вероятно,% этой полосы будет одного цвета с меткой. Это то, что у меня сейчас есть:

введите описание изображения здесь

Я сталкиваюсь с проблемами, связанными с 1) использованием предопределенной пропорции в качестве заливки и 2) наличием двух разных «заливок» (одна для биологического пола, одна для предопределенной пропорции.

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

 ggplot(data=who_votes_data, aes(x=age_bin,y=1, fill=gender))  
  geom_bar(stat='identity',aes(fill = gender), position = position_dodge2())  
  facet_wrap(~race_ethnicity, nrow = 2, scales = "free")   
  geom_text(aes(label=paste0(sprintf("%1.1f", prop*100),"%"), y=prop), 
            colour="white")  
  labs(x = expression("Age Group"), y= ("Prortion of Likely Voters"),
       title = "Proportion of Likely Voters Across Age Groups, Race/Ethnicity, and Sex",
       caption="Figure 1")   theme(plot.caption = element_text(hjust = 0.5, vjust = -0.5, size = 18))
  

https://docs.google.com/spreadsheets/d/1a7433iwXNSwcuXDJOvqsxNDN6oaYULVlyw22E41JROU/edit?usp=sharing

Обновленный код:

 library(tidyverse)
library(ggplot2)
df<- read.csv("samplevotes.csv")

df %>% 
group_by(race_ethnicity, age_bin, gender) %>% 
summarise(Likely = sum(Likely), 
          Unlikely = sum(Unlikely), 
          proportion = Likely/(Likely Unlikely)) %>% ungroup() %>% 
ggplot(aes(x = age_bin, y = proportion, fill = gender))   
geom_bar(stat = "identity", position = "dodge")   
facet_wrap(~race_ethnicity, nrow = 2)   
geom_text(aes(label=paste0(sprintf("%1.1f", proportion*100),"%"), y=proportion), position = position_dodge(width = 1),  colour="Black", size = 2.2)   
labs(x = expression("Age Group"), y= ("Proportion of Likely Voters"), title = "Proportion of Likely Voters Across Age Groups, Race/Ethnicity, and Sex", caption="Figure 1")  
 theme(plot.caption = element_text(hjust = 0.5, vjust = -0.5, size = 18))
  

введите описание изображения здесь

Комментарии:

1. Вам нужно сделать likely и Nonlikely один столбец с. pivot_longer Также, пожалуйста, предоставьте некоторые данные.

2. Большое спасибо за быстрый ответ! Я добавил ссылку с некоторыми данными — можете ли вы подробнее рассказать об использовании pivot_longer? РЕДАКТИРОВАТЬ: документация nvm была довольно ясной. Есть ли у вас какие-либо рекомендации по созданию графика с этим новым расположением?

Ответ №1:

Вот код, который я бы использовал. Я внес некоторые изменения в зависимости от способа объединения данных.

 df %>% 
group_by(race_ethnicity, age_bin, gender) %>% 
summarise(Likely = sum(Likely), 
          Unlikely = sum(Unlikely), 
          proportion = Likely/(Likely Unlikely)) %>% ungroup() %>% 
ggplot(aes(x = age_bin, y = proportion, fill = gender))   
geom_bar(stat = "identity", position = "dodge")   
facet_wrap(~race_ethnicity, nrow = 2)   
geom_text(aes(label=paste0(sprintf("%1.1f", proportion*100),"%"), y=proportion), position = position_dodge(width = 1),  colour="Black", size = 2.2)   
labs(x = expression("Age Group"), y= ("Proportion of Likely Voters"), title = "Proportion of Likely Voters Across Age Groups, Race/Ethnicity, and Sex", caption="Figure 1")  
 theme(plot.caption = element_text(hjust = 0.5, vjust = -0.5, size = 18))
  

Вот как это выглядит
введите описание изображения здесь

Комментарии:

1. Большое вам спасибо! Быстрый вопрос — выполняли ли вы какую-либо другую предварительную обработку вне загрузки в dataframe? Я предполагаю, что вы никогда не использовали pivot_longer, поскольку вероятный столбец не поврежден, но это вызывает следующую ошибку при его запуске: Ошибка: по крайней мере один слой должен содержать все переменные фасетирования: race_ethnicity . * Отсутствует график race_ethnicity * Отсутствует слой 1 race_ethnicity * Отсутствует слой 2 race_ethnicity

2. Я использовал library(tidyverse) . А ты ?

3. Да! Я думаю, что %>% терпит неудачу без этого, поэтому у меня это было с самого начала. Я использую ggplot2 и R.4.0.2

4. ты ungroup()

5. Да — я добавил обновленный фрагмент кода в конец основной части вопроса выше, если это поможет!