Blog der Heimetli Software AG

Entwicklung der Bevölkerungspyramide von Taiwan

Wie man hier sieht kann R mit gganimate auch Verläufe darstellen:

Animierte Darstellung der Bevölkerungspyramide

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.