Przed świętami w tym wpisie pokazaliśmy interaktywną choinkę napędzaną statystykami popularności imion nadawanych dzieciom w Warszawie. Ale święta się już skończyły, czas choinkę rozebrać. W ramach akcji 'rozbieranie choinki’ pokażemy jak można ją zrobić krok po kroku.
Dziś część pierwsza – choinka w ggplot2.
Choinka przedstawia statystyki dla chłopców i dziewcząt. Zacznijmy od prawej części 'dla chłopców’. Punktem wyjścia będzie ramka danych z imieniem, płcią, liczbą wystąpień oraz pozycją na choince, na które dane imię powinno zawisnąć.
# data from # https://github.com/pbiecek/SmarterPoland_blog/tree/master/2014/choinka # head(chlopcy) imie plec liczba row col 1 Amadeusz M 1 0.9444444 0.05555556 2 Anatol M 1 0.8888889 0.11111111 3 Arnold M 1 0.8888889 0.05555556 4 August M 1 0.8333333 0.16666667 5 Augustyn M 1 0.8333333 0.11111111 6 Bazyli M 1 0.8333333 0.05555556 |
Użyjmy geometrii geom_point() aby pokazać współrzędne do zawieszenia imion.
ggplot(chlopcy, aes(x=col, y=row)) + geom_point() |
Zamiast punktów, chcemy wyświetlać imiona, więc docelowo wykorzystamy geometrię geom_text(). Na razie zamiast imion wyświetlmy napis 'abcde’. Napis ten obrócimy w zależności od pozycji na choince. Im wyżej oraz im bliżej pnia tym napis będzie bardziej pionowy. Im bardziej na zewnątrz, tym bardziej płaski. Za obracanie odpowiada parametr `angle`.
ggplot(chlopcy, aes(x=col, y=row, label="abcde", angle=-(1.5-col)*45*(row+0.1)^.2)) + geom_text(hjust=0, vjust=0) |
Dodajmy do choinki właściwe imiona. Popularność imienia dodatkowo oznaczymy wielkością i kolorem (parametry size i color).
ggplot(chlopcy, aes(x=col, y=row, label=imie, angle=-(1.5-col)*45*(row+0.1)^.2, size=liczba, color=liczba)) + geom_text(hjust=0, vjust=0) |
Prawdziwe choinki nie mają kształtu trójkąta. Zwiększymy naturalność ściskając choinkę u góry i rozciągając u dołu. Osiągniemy to przez modyfikację współrzędnej x w zależności od wysokości na choince.
ggplot(chlopcy, aes(x=-0.04+col*(2-row), y=row, label=imie, angle=-(1.5-col)*45*(row+0.1)^.2, size=liczba, color=liczba)) + geom_text(hjust=0, vjust=0) |
Usuwamy wszystkie zbędne elementy (legendę, współrzędne, opisy osi, szare tło) oraz zmieniamy kolory, którymi kodowana jest popularność imienia (niech to będzie gradient od green1 do green4). Zmienimy też zakres wielkości nazw na choince. Domyślny sprawiał, że rzadkie imiona były bardzo małe a często bardzo duże, Funkcja scale_size_continuous() coś na to poradzi.
ggplot(chlopcy, aes(x=-0.04+col*(2-row), y=row^1, label=imie, angle=-(1.5-col)*45*(row+0.1)^.2, size=liczba, color=liczba)) + geom_text(hjust=0, vjust=0) + scale_size_continuous(range=c(4,6))+ scale_color_gradient(low="green4",high = "green1") + theme_tufte() + ylim(-0.05,0.95) + xlim(0,2.1) + xlab("") + ylab("") + theme(legend.position="none", axis.ticks=element_line(color="white", size=0), axis.text=element_text(color="white", size=0)) |
Na koniec dodajemy lewą stronę dla dziewczynek. Wszystkie graficzne parametry są już ustawione. Wystarczy dodać kolejną geometrię geom_text() ale za źródło danych podając dane dla dziewczynek.
ggplot(chlopcy, aes(x=-0.04+col*(2-row), y=row^1, label=imie, angle=-(1.5-col)*45*(row+0.1)^.2, size=liczba, color=liczba)) + geom_text(hjust=0, vjust=0) + scale_size_continuous(range=c(4,6))+ scale_color_gradient(low="green4",high = "green1") + theme_tufte() + ylim(-0.05,0.95) + xlim(-2.1,2.1) + xlab("") + ylab("") + theme(legend.position="none", axis.ticks=element_line(color="white", size=0), axis.text=element_text(color="white", size=0)) + geom_text(data=dziewczynki, aes(x=0.04-col*(2-row), angle=(1.5-col)*45*(row+0.1)^.2), hjust=1, vjust=1) |
W drugim odcinku pokażemy jak zrobić choinkę interaktywną, dodając live-search z biblioteką shiny.
dzieki za kod.
mam jedno pytanie dotyczace danych, konkretnie chodzi o kolumny row i col
Skad wziely sie te wartosci?
to sekwencje z linii na linie coraz dłuższe
coś w stylu:
x = sapply(1:18, function(x) rep(1:18, each=x))/18
y = rep(1:18, 1:18)/18
dzieki za wyjasnienie!