Entwicklung der Bevölkerungspyramide von Taiwan
Wie man hier sieht kann R mit gganimate auch Verläufe darstellen:
gganimate erzeugt direkt ein animiertes GIF, und das wird hier ohne weitere Bearbeitung angezeigt. Der seltsame Auswuchs bei 100 Jahren ist kein Fehler der Darstellung, er entsteht weil alle Personen über 99 in einer Zahl zusammengefasst werden.
Die Daten für die Darstellung stammen von population.un.org
Die Daten für diese Graphen
Wie so oft hat das Data Wrangling mindestens gleichviel Zeit gekostet wie die Visualisierung selbst. Die Daten stehen in zwei riesigen Excel-Spreadsheets, einmal für die Frauen und einmal für die Männer. Beide Spreadsheet-Files decken die ganze Welt ab, die interessanten Zeilem müssen also zuerst herausgesucht werden. ggplot braucht die Daten im long-Format, was einen weiteren Schritt erforderlich macht. Zuletzt wurden die Daten aus beiden Files mit Kennungen versehen und zusammengeführt.
Das Resultat vom Data Wrangling:
year,gender,age,count 1950,F,0, 151 1950,F,1, 134 1950,F,2, 123 1950,F,3, 114 1950,F,4, 109 1950,F,5, 105 1950,F,6, 102 1950,F,7, 99 . . .
Der count für die Männer ist negativ um sie links vom Nullpunkt darzustellen. Die negativen Zahlen auf der Achse werden durch einen Parameter von scale_y_continuous in positive konvertiert.
Der R Code
Diese wenigen Zeilen sind alles was es braucht um das GIF zu erstellen!
library( tidyverse ) library( gganimate ) library( gifski ) pop <- read.csv( "population.csv" ) plt <- ggplot( pop, aes(x=age,y=count,color=gender,fill=gender) ) + geom_bar( stat="identity" ) + coord_flip() + scale_color_manual( values=c("#FF69C0","#40C0FF") ) + scale_fill_manual( values=c("#FF69C0","#40C0FF") ) + scale_y_continuous( labels=abs, limits=c(-230,230) ) + transition_time( year ) + labs( title="Year {frame_time}", y="count (thousands)") animate( plt, end_pause=60, duration=50, height=800, width=620 ) anim_save( "population.gif" )
So ganz problemlos sind die Animationen aber nicht: die Angabe von end_pause ruinierte die X-Achse. Nach einiger Suche habe ich herausgefunden dass fixe Limits für die Achse dieses Problem beheben. Die fixen Achsen sorgten aber für Löcher an den Stellen wo sie überschritten wurden. Erst nach einigen Versuchen mit weiteren Grenzen sieht es jetzt aus wie ich es will.