We wtorek pisałem o tym jak problemy demograficzne Polski wyglądają na tle innych państw. Dziś też nawiążę do demografii, ale myśl przewodnia dotyczy aspektów technicznych.
Na podstawie danych o rocznej liczbie narodzin na 1000 mieszkańców i o średnim wieku urodzenia pierwszego dziecka pokażę jak w R wykonać grafikę SVG, która jest interaktywna. Tzn po umieszczeniu na stronie pozwala na pewną interakcję.
Zaczęło się od listu od Macieja B. na temat pakietu do programu R o nazwie 'SVGAnnotation’ (dostępny na OmegaHat). Pakiet ten pozwala na zapisywanie wykresów R do formatu SVG, a dodatkowo pozwala na zawarciu w wykresie prostej interakcji, typu: podpisy aktywowane najechaniem na myszki na punkt/obszar, dodanie suwaka czy pól wyboru. Proste elementy ale użyteczne i do tego można je generować bezpośrednio z R! Nadarzyła się okazja by wypróbować ten pakiet. Nie wszystko jeszcze w nim działa, są problemy z kodowaniem, ale i tak ma interesujące możliwości, jedną z nich pokażę poniżej.
Zacznijmy od danych. Z serwisu nationmaster.com pobrałem dane dotyczące średniego wieku urodzenia pierwszego dziecka (oczywiście średnia liczona tylko dla kobiet, które urodziły jakieś dziecko) oraz rocznej liczby narodzin na 1000 mieszkańców.
1 2 3 4 5 6 7 8 | head(dane) # p.dziecko urodzin.na.1000 # Austria 26.3 9.50 # Czech Republic 24.9 9.99 # Finland 27.4 11.00 # Hungary 25.1 9.60 # Iceland 25.5 14.20 # Ireland 27.8 15.30 |
Poniższy kod tworzy wykres, dodaje do każdego punktu adnotacje i zapisuje wynik do pliku demografiaInteraktywna.svg.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # argument funkcji svgPlot to kod programu R generujący wykres, tutaj wykres punktowy doc <- svgPlot({ plot(urodzin.na.1000 ~ p.dziecko, dane, pch=19, las=1, xlab="Sredni wiek urodzenia pierwszego dziecka", ylab="liczba urodzen na rok na 1000 mieszkancow") points(dane[11,1], dane[11,2], cex=1.5, col="red3", pch=19) axis(3) axis(4,las=1) }) # obiekt 'doc' opisuje XMLową strukturę pliku SVG, używając funkcji getPlotPoints() # można z tej struktury wyciągnąć wierzchołki odpowiadające punktom na wykresie. punkty <- getPlotPoints(doc)[[1]] # przygotowujemy wektor nazw dla punktów nazwy <- paste(rownames(dane), ", sredni wiek urodzenia pierwszego dziecka: ", dane[,1], ", roczna liczba porodow na 1000 mieszkancow: ", dane[,2], sep="") # dodajemy etykietki punktów do punktów addToolTips(punkty, nazwy) # zapisujemy cały wykres do pliku demografiaInteraktywna.svg saveXML(doc,"demografiaInteraktywna.svg") |
Wynik powyższego kodu można oglądać poniżej.
Czerwony punkt to Polska. Dla wszystkich punktów można odsłonić nazwę kraju po po najechaniu na punkt kursorem myszki. Starsze przeglądarki mogą nie radzić sobie z przetwarzaniem plików SVG. W chromie aby zobaczyć rysunek trzeba odświeżyć stronę, ale nosze wersje Firefox, IE i Mozilla radzą sobie bez problemu.
Polska, Węgry, Czechy i Słowakia tworzą grupę krajów o najniższej liczbie porodów i najniższym średnim wieku urodzenia dziecka.
Ciekawe czy dałoby się z wykorzystaniem tego pakietu zrobić wykresy typu drill down (np. http://robslink.com/SAS/democd9/pfizer.htm) albo może jest do tego inny pakiet? Fajnie będzie widzieć rozwój tego pakietu, jest bardzo interesujący.
Myślę, że SVg pozwala na zapisanie zbioru widoków i wyświetlania różnych widoków w zależności od tego co się kliknie. Ale pomiędzy ,,widokami” nie będzie pewnie animacji.
Takie rzeczy, lepiej zrobić używając biblioteki D3.
Czekam zresztą aż pojawi się pakiet generujący kod w d3js z poziomu R.
To byłoby coś!
O kurde, super jest to d3js!
I znalazłem kolejny fajny pakiet – treemap, który tworzy wykresy podobne do tego: http://mbostock.github.com/d3/ex/treemap.html jednak bez interakcji.