Как наложить линейный график на гистограмму с накоплением (Dplyr)?

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

В настоящее время я построил две отдельные гистограммы с накоплением, но думаю, что они выглядели бы лучше, если бы они были объединены в одну.

Мои данные выглядят так:

ID   Year   Party  Change
1    2010   Labour  NA
1    2011   Labour  No Change
1    2012   Con     Change
1    2013   Con     No Change
2    2010   Con     No Change
2    2011   Con     No Change
2    2012   Con     No Change
2    2013   Con     No Change
... etc.

Это графики, которые я уже построил.

library(dplyr)
library(ggplot2)

df %>%
  group_by(Change) %>%
  filter(Year != 2010) %>%
  ggplot(aes(fill = Change, y = ID, x= Year)) + 
    geom_bar(stat="identity", position = "fill") +
    xlab("Year") +
    ylab("% of Sample") 

https://imgur.com/lhCoXaR


ggplot(df, aes(fill = PolParty, y = pidp, x = wave)) + 
    geom_bar(stat="identity", position = "fill") +
  xlab("Year") +
  ylab("% of Sample") +

https://imgur.com/0qbIL5h

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


person skipndipp    schedule 08.04.2019    source источник
comment
Откуда взялась переменная wave? Отличается ли она от другой оси X, YEar?   -  person Jon Spring    schedule 09.04.2019
comment
Волна - это год, прошу прощения за это. Я подумал, что будет понятнее сказать год, поскольку именно это оно и означает.   -  person skipndipp    schedule 09.04.2019


Ответы (1)


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

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

library(dplyr)
library(ggplot2)

data <- "ID   Year   Party  Changed_seats
1    2010   Labour  NA
1    2011   Labour  No_Change
1    2012   Con     Change
1    2013   Con     No_Change
2    2010   Con     No_Change
2    2011   Con     No_Change
2    2012   Con     No_Change
2    2013   Con     No_Change
3    2014   Con     No_Change
3    2015   Con     Change
3    2016   Con     Change
3    2017   Con     No_Change
4    2014   Con     No_Change
4    2015   Con     Change
4    2016   Con     Change
4    2017   Con     No_Change"

df <- read.table(text = data, header = TRUE) 


seat_changes_df <- df %>%
  select(Year, Changed_seats) %>%
  mutate(Year = as.factor(Year)) %>%
  group_by(Year) %>%
  mutate(Prop_change = sum(Changed_seats == "Change")/n())

ggplot() + 
  geom_line(data = seat_changes_df, aes(x = Year, y = Prop_change), group = 1) +
  scale_y_continuous(labels = scales::percent) +
  xlab("Year") +
  ylab("Seats changed")
#> Warning: Removed 2 rows containing missing values (geom_path).

person Fons MA    schedule 08.04.2019
comment
Большое спасибо, это невероятно. Я чувствую, что это должно работать, но по какой-то причине моя консоль автоматически добавляет отсутствующие переменные группировки: id. Как я могу отключить это? В настоящее время на выходе отображается только горизонтальная линия. - person skipndipp; 09.04.2019
comment
В какой-то момент до того, как вы поместили id в вызов group_by либо по имени (что должно быть очевидно), либо по позиции (group_by(1:3), т.е. более коварно). Возможно, вам потребуется ungroup() перед дальнейшими операциями или пересмотреть необходимость группировки по id. - person Fons MA; 09.04.2019