Projekt 1
Techniczne warunki zaliczenie
- Termin:
- Format: Pojedynczy plik
R
kodowany jako UTF-8 - Zawartość: w komentarzu w pierwszej linii proszę podać imię, nazwisko i numer albumu, skrypt musi tworzyć zawierać definicję funkcji oraz przykłady
- Pakiety: standardowe;
lubridate
- Osoba: plik należy przesłać do osoby prowadzącej zajęcia na adres szkolny z adresu szkolnego
Opis projektu
Zadanie polega na napisaniu i wykorzystaniu funkcji timelinePlot
, która przyjmuje następujące argumenty:
events
lista przedziałów czasu (okresy),eventslabels
wektor stringów zawierający nazwy przedziałów (okresów),plottitle = ""
tytuł wykresu, jeżeli zostanie podany,dates = FALSE
wartość logiczna, która przełącza wyświetlanie dat przy przedziałach,marginleft = 2
wielkość marginesu z lewej strony wykresu,col = "black"
kolor wizualizacji przedziałów czasu,labelscex = 1
skala wyświetlania nazw okresów po lewej stronie wykresu,xlimadj = 0
, procentowe zwiększenie przedziału całości wizualizacji,lwd = 1
grubość linii wizualizujących przedziały czasu,cex = 1
wielkość puktów oznaczających końce przedziałów czasu.
Zadaniem funkcji jest wizualizacja list przedziałów czasu w sposób pokazany poniżej.
W przykładowych wizualizacjach będziemy wykorzystywali dwa zbiory danych:
W poniższych przykładach dane zostały wgrane bezpośrednio ze strony, co wydaje się najlepszym rozwiązaniem i proponuję je wykorzystać.
Przykładowa pierwsza wizualizacja jest pokazana poniżej. W pierwszej kolejności wgrywany jest zbiór danych
d0 <- read.csv(file = "http://michal.ramsza.org/lectures/2_r_programming/data/event_data.csv") d0
X Event DateStart DateEnd 1 1 First event 2020-01-01 2020-03-01 2 2 Middle event 2020-02-01 2020-06-01 3 3 Last event 2020-05-01 2020-07-01
Jak widać zbiór ten zawiera trzy kolumny, pierwsza to opis przedziału czasu, druga to string określający początek przedziału czasu i trzecia to string określający koniec przedziału czasu. Zbiór ten jest przetworzony do odpowiedniej postaci (wykorzystane struktury danych są pozostawione do Państwa dyspozycji, oczywiście nie przekraczając wymagań technicznych).
Po przetworzeniu możemy wykorzystać stworzoną funkcję timelinePlot()
do wykonania kilku różnych wizualizacji. W pierwszej kolejności tworzymy domyślną wizualizację.
par(mfrow = c(1, 1)) timelinePlot(events = dates, eventslabels = datesNames) dev.copy(device = png, "./fig1.png", width = 600, height = 400) dev.off()
Otrzymujemy podstawową wizualizację, która zawiera nazwy przedziałów czasu oraz zaznaczone przedziały. Wizualizcja jest przedstawiona poniżej.
Figure 1: Podstawowa wizualizacja
W następnej kolejności chcemy stworzyć kilka innych typowych wizualizacji. Poniższy kod tworzy kilka z takich wizualizacji.
par(mfrow = c(2, 2)) timelinePlot(events = dates, eventslabels = datesNames, plottitle = "Wizualizacja z datami", dates = TRUE) timelinePlot(events = dates, eventslabels = datesNames, plottitle = "Zmieniony kolor", dates = TRUE, col = "blue", marginleft = 1.2) timelinePlot(events = dates, eventslabels = datesNames, plottitle = "Zmniejszone opisy", dates = TRUE, col = "magenta", marginleft = 1.2, labelscex = .5) timelinePlot(events = dates, eventslabels = datesNames, plottitle = "Zmieniony styl", dates = TRUE, col = "cyan", marginleft = 1.2, labelscex = .5, cex = 2, lwd = 4) dev.copy(device = png, "./fig2.png", width = 600, height = 400) dev.off()
Wizualizacje te są pokazane poniżej.
Figure 2: Kilka typowych wizualizacji
Widząc już jak działa stworzona funkcja timelinePlot()
chcemy wykorzystać ją do wizualizacji danych, które są w drugim zbiorze. W pierwszej kolejności wgrywamy ten zbiór.
d0 <- read.csv(file = "http://michal.ramsza.org/lectures/2_r_programming/data/disease_data.csv") head(d0)
Event DateStart DateEnd Disease DiseaseSuspects 1 Antonine Plague 165 180 <NA> Smallpox 2 Plague of Cyprian 250 266 <NA> Smallpox 3 Plague of Justinian 541 542 Plague <NA> 4 Plague of 664 664 689 Plague <NA> 5 735–737 Japanese smallpox epidemic 735 737 Smallpox <NA> 6 Plague of 746–747 746 747 Plague <NA>
Jak widać, zbiór ten zawiera nazwę epidemii, szacowany rok rozpoczęcia i zakończenia epidemi oraz nazwę choroby a jeżeli nie można zidentyfikować choroby z dużą pewnością to podane są przypuszczalne choroby. Przyjmujemy konwencję, że początek epidemii zawsze jest 1 stycznia a koniec epidemii zawsze 31 grudnia. Zadanie polega na tym, aby stworzyć następujące wizualizacje.
Po wstępnym przetworzeniu zbioru dysponujemy listą przedziałów czasu oraz ich nazwami (niektóre z epidemii nie mają przypisanych nazw). Chcemy wykonać wizualiację wszystkich epidemii, dla których z dużym prawdopodobieństwem przyczyniła się ospa (smallpox). Poniżej wykonane są takich przykładowe wizualizacje.
par(mfrow = c(1, 1)) timelinePlot( events = d2Events, eventslabels = d2Names, marginleft = 2.5, labelscex = .7, col = "blue") dev.copy(device = png, "./fig3.png", width = 600, height = 400) dev.off()
Powyższy kod tworzy poniższą wizualizację.
Figure 3: Epidemię wywołane ospą
Poniżej mamy jeszcze jedną wizualizację obejmującą 5 ostatnich zarejestrowanych epidemii spowodowanych przez ospę.
par(mfrow = c(1, 1)) timelinePlot( events = d2Events[23:27], eventslabels = d2Names[23:27], marginleft = 2.5, labelscex = .7, col = "blue", dates = TRUE) dev.copy(device = png, "./fig4.png", width = 600, height = 400) dev.off()
Powyższy kod tworzy następujący wykres.
Figure 4: Ostatnie 5 epidemii wywołanych przez ospę
Jako ostatni przykład stworzona jest wizualizacja epidemii cholery oraz ostatnich kilku epidemii z dodanymi datami.
par(mfrow = c(1, 1)) timelinePlot( events = d2Events, eventslabels = d2Names, marginleft = 2.5, labelscex = .7, col = "blue", dates = FALSE, plottitle = "Epidemie cholery") dev.copy(device = png, "./fig6.png", width = 600, height = 400) dev.off() par(mfrow = c(1, 1)) timelinePlot( events = d2Events[31:35], eventslabels = d2Names[31:35], marginleft = 2.5, labelscex = .7, col = "blue", dates = TRUE, plottitle = "Ostatnie epidemie cholery") dev.copy(device = png, "./fig7.png", width = 600, height = 400) dev.off()
Powyższy kod tworzy dwie wizualizcje pokazane poniżej.
Figure 5: Epidemie cholery
Figure 6: Ostatnie 5 epidemii cholery
Podsumowując zadanie: w pierwszej kolejności należy stworzyć funkcję timelinePlot()
opisaną dokładnie powyżej. W tym miejscu mają Państwo pewną dowolność, np. w jaki sposób są reprezentowane przedziały czasu. Następnie, wykorzystując stworzoną funkcję, należy wykonać powyższe wizualizacje korzystając ze wskazanych zbiorów danych.