Как создать график из двух разных фреймов данных (или как объединить фреймы данных с одинаковыми именами столбцов)

#r #tidyverse

#r #tidyverse

Вопрос:

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

 df2019 <- data.frame(Institute = c("A","B","C"),Women = c(65,50,70),Men = c(35,50,30))
df2016 <- data.frame(Institute = c("A","B","C"),Women = c(70,45,50),Men = c(30,55,50))

df2019_melted <- melt(df2019)

ggplot(data = df2019_melted, aes(x = Institute, y = value, fill = variable)) 
  geom_bar(stat = "identity", position = "dodge") 
  labs(fill = "Gender") 
  xlab("Institute") 
  ylab("Percent") 
  scale_fill_discrete(labels = c("Women","Men")) 
  ggtitle("Overall Gender Composition 2019")
  

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

Поскольку имена столбцов одинаковы для всех моих фреймов данных, я не могу использовать rbind () или аналогичный, поскольку он не различает, какой фрейм данных является тем, что при объединении.

Как выглядит каждый отдельный фрейм данных при построении графика

Ответ №1:

Добавьте столбец для year в свои фреймы данных, а затем объедините и расплавьте. ggplot предпочитает, чтобы все было в одном data.frame

 all_melted <- reshape2::melt(
  rbind(cbind(df2019, year=2019), cbind(df2016, year=2016)),
  id=c("year", "Institute"))
  

Затем вы можете построить график с помощью чего-то вроде этого, сопоставив год с альфой, чтобы создать «выцветшие» столбцы

 ggplot(all_melted, aes(x = Institute, y = value, fill = variable, alpha=factor(year))) 
  geom_col(position = "dodge") 
  labs(fill = "Gender") 
  xlab("Institute") 
  ylab("Percent") 
  scale_alpha_discrete(range=c(.4, 1), name="Year")   
  ggtitle("Overall Gender Composition")
  

Результирующий график