2017-01-30 9 views
0

У меня есть data.frame, содержащий распределение мест в парламенте между партиями в год выборов. В конце концов, я хотел бы получить график, подобный этому one. Я хочу представить состав парламента на протяжении многих лет не только на год выборов.Как визуализировать «ступенчатое» изменение состава в течение времени

results<-structure(list(party = c("PARTY1", "PARTY1", "PARTY1", "PARTY1", "PARTY2", "PARTY2", 
"PARTY2", "PARTY2", "PARTY2", "PARTY2", "PARTY3", "PARTY3", "PARTY3", "PARTY3", "PARTY3", 
"PARTY3", "PARTY3", "PART4", "PART4", "PART4", "PART4"), year = c(1996, 
1998, 2000, 2010, 1996, 2000, 2002, 2006, 2010, 2014, 1996, 1998, 
2000, 2002, 2006, 2010, 2014, 2002, 2006, 2010, 2014), party.seats = c(8, 
6, 5, 3, 19, 8, 10, 9, 7, 10, 9, 4, 6, 5, 3, 4, 5, 3, 7, 8, 6 
)), class = "data.frame", row.names = c(NA, -21L), .Names = c("party", 
"year", "party.seats")) 

Я способен производить гистограмму, которая, однако, только представляет мне данные для года выборов и скучает годы между выборами.

ggplot(data=results,aes(x=as.factor(year), y=party.seats, fill=party, label=party))+geom_bar(stat="identity") 

Я способен производить ggplot диаграмму с geom_area, который, однако, вводит в заблуждение, поскольку она предполагает, что распределение мест меняется в течение года после выборов (есть помои, а не «шаг»).

ggplot(as.data.frame(xtabs(party.seats~year+party, results)), aes(x=as.Date(as.character(year), "%Y"), y = Freq, fill = party)) + geom_area(position = "stack") 

Любая помощь? Мне особенно интересно, есть ли команда (связанная с временными рядами?), Которая будет принимать результаты года выборов на все последующие годы до тех пор, пока не будут проведены новые выборы. Таким образом, в основном, команда, которая принимает событие выборов в момент х как продолжающееся (= заполняет годы между ними), пока не будут проведены новые выборы в момент времени y.

ответ

2

Я думаю, что geom_step является то, что вы ищете, хотя Простейшая реализация не будет иметь бары/зоны складывают к общему числу мест, выделенных (хотя это может быть лучше):

ggplot(data=results 
     , aes(x=year 
      , y=party.seats 
      , col=party)) + 
    geom_step() 

enter image description here

Если вы действительно хотите, чтобы вы могли получить заполнение, хотя, как и в ответе @ Haboryme, вам нужно будет создать все точки между выборами. Здесь я использую dplyr/tidyr, чтобы добавить новую строку данных для каждого дня между выборами (вам просто нужно разрешение достаточно узкое, чтобы «шаг» появился мгновенно, а не разворачивался в течение полного года на конечном участке), некоторые из них добавились после самые последние выборы, чтобы эти ценности действительно отображались. Затем я заполняю партийные места от перед началом до следующих выборов и устанавливаю пропуски на 0 для хорошей меры (до того, как у партии были какие-либо места).

Обратите внимание, что вы могли бы расширить это точные даты выборов, а не только годы без необходимости изменять слишком много

results %>% 
    complete(year = full_seq(c(min(year), max(year) + 1), 1/365), party) %>% 
    group_by(party) %>% 
    fill(party.seats) %>% 
    replace_na(replace = list(party.seats = 0)) %>% 
    ggplot(
    aes(x=year 
     , y=party.seats 
     , fill=party)) + 
    geom_area(position = "stack") 

дает

enter image description here

Я до сих пор предпочитают строки, хотя , так как легче сравнивать стороны друг против друга, когда они не сложены друг на друга. Например, с 2010 по 2014 год трудно сказать из версий области, имеет ли партия 2 или 4 больше мест (но это ясно из строк).

1

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

library(tidyverse)      
library(zoo) 
all_years=seq(min(results$year),max(results$year)) #get the sequence of all the years considered 
filled=data.frame(party=rep(unique(results$party),each=length(all_years)), #build a df with the seq of years for each party 
        year=rep(all_years,length(unique(results$party)))) 

Затем слить с вашими данными и заполнить NA (с 0, если в самом начале, с самым последним значением еще) :

df=merge(results,filled,by.y=c("party","year"),all.y=T)%>% 
    group_by(party)%>% 
    na.locf()%>% 
    mutate(party.seats=coalesce(as.numeric(party.seats), 0)) 

Участок с geom_bar и width=1 иметь что-то, что выглядит непрерывным:

ggplot(data=df,aes(x=as.factor(year), y=party.seats, fill=party, label=party))+ 
    geom_bar(stat="identity",width = 1) 

Это дает (ось й нуждается в некоторой настройке):
enter image description here

1

Вы можете попробовать фантазии streamgraph тоже (вы получите plotly как мышь-парения подсказок тоже):

library(dplyr) 
library(streamgraph) 
results %>% 
    streamgraph("party", "party.seats", "year") %>% 
    sg_axis_x(1, "year", "%Y") %>% 
    sg_legend(TRUE, "party") 

enter image description here

results %>% 
    streamgraph("party", "party.seats", "year", offset="zero", interpolate="step") %>% 
    sg_axis_x(1, "year", "%Y") %>% 
    sg_fill_brewer("PuOr") 

enter image description here