Projekt 1

Techniczne warunki zaliczenie

  • Termin: [2022-05-31 Tue]
  • 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.

fig1.png

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.

fig2.png

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ę.

fig3.png

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.

fig4.png

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.

fig6.png

Figure 5: Epidemie cholery

fig7.png

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.

Data: 2022-04-12 Tue 00:00

Autor: Michał Ramsza

Created: 2022-04-14 Thu 13:22

Validate