2017-01-30 1 views
0

Ich habe einen data.frame, der die Verteilung der Sitze im Parlament zwischen Parteien im Jahr der Wahl enthält. Schließlich möchte ich eine ähnliche Grafik wie diese one erhalten. Ich möchte die Zusammensetzung des Parlaments im Laufe der Jahre nicht nur für das Wahljahr visualisieren.Wie "stufenweise" Veränderung der Zusammensetzung im Laufe der Zeit zu visualisieren

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")) 

Ich bin in der Lage ein Balkendiagramm zu erzeugen, die jedoch zeigt mir nur die Daten für das Wahljahr und vermisst die Jahre zwischen den Wahlen.

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

Ich bin in der Lage ein ggplot Diagramm mit geom_area zu erzeugen, die jedoch irreführend, da es deutet darauf hin, dass die Verteilung der Sitze nach den Wahlen in den Jahren zu ändern (es gibt einen Slop, und nicht einen „Schritt“).

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") 

Irgendwelche Hilfe? Ich frage mich besonders, ob es ein (zeitlich zusammenhängendes?) Kommando gibt, das die Ergebnisse des Wahljahres auf alle folgenden Jahre bis zu Neuwahlen bringen würde. Im Grunde also ein Befehl, der das Wahlereignis zur Zeit x als fortlaufend (= füllt Jahre dazwischen) bis zur Neuwahl zur Zeit y abhält.

Antwort

2

Ich denke, dass geom_step ist das, was Sie suchen, obwohl die einfachste Implementierung nicht die Stäbe haben/Bereiche auf die Gesamtzahl der Sitze stapeln zugeteilt (obwohl das besser sein können):

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

enter image description here

Wenn Sie wirklich wollen, können Sie die Füllungen bekommen, obwohl wie in @ Haboryme Antwort müssen Sie alle Punkte zwischen den Wahlen generieren. Hier verwende ich dplyr/tidyr, um eine neue Datenzeile für jeden Tag zwischen den Wahlen hinzuzufügen (Sie brauchen nur die Auflösung, die so schmal ist, dass der "Schritt" sofort erscheint und nicht über ein ganzes Jahr auf der endgültigen Handlung verteilt wird) letzte Wahl, um diese Werte tatsächlich zu zeigen. Ich fülle dann die Partysitze von vorher bis zur nächsten Wahl aus und setze die Missings für gute Maßnahme auf 0 (bevor die Partei Sitze hatte).

Beachten Sie, dass dies mit den genauen Daten der Wahlen statt nur die Jahre verlängern konnte, ohne zu viel obwohl zu modifizieren, um

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") 

gibt

enter image description here

ich immer noch lieber die Linien , da es einfacher ist, die Parteien gegeneinander zu vergleichen, wenn sie nicht übereinander gestapelt sind. Zum Beispiel ist es von 2010 bis 2014 schwierig, aus den Gebietsversionen zu ersehen, ob Partei 2 oder 4 mehr Sitze hat (aber es ist klar von den Linien).

1

könnte ein weitere Option, um den vollständigen Datenrahmen mit all fehlenden Jahren zu erstellen:

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)))) 

Dann mit Ihren Daten und füllen Sie die NA (mit 0, wenn am Anfang, mit dem letzten Wert sonst) fusionieren :

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)) 

Grundstück mit geom_bar und width=1 etwas zu haben, das kontinuierlich aussieht:

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

Es gibt (die x-Achse benötigt einige Optimierungen):
enter image description here

1

Sie Lust streamgraph versuchen (Sie plotly wie Maus-Hover-Tooltips zu bekommen):

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

Verwandte Themen