1 Podstawowa grafika w R

UWAGA: Ta części laboratorium 4 dotyczy podstawowej grafiki w R. Należy “wypróbować” działanie omawianych argumentów - np. poprzez dobór kolorów na wykresie, własny opis osi, własny tytuł wykresu itd. Na koniec kilka prostych zadań.

UWAGA: W jednym z kolejnych laboratoriów omówimy pakiet ggplot2, który ma dużo większe możliwości.

Podstawowa metoda tworzenia wykresów w R jest użycie polecenia plot(x,y) , gdzie x jest wektorem argumentów (oś OX), a y jest wektorem wartości (oś OY).

Polecenie plot pozwala również na ustawienie zakresów osi, nadanie osiom nazw itp. Szczegółową pomoc na temat obu opcji można uzyskać wpisując polecenie ? plot.default.

Zaczynamy od prostego wykresu punktowego oraz kawałkami liniowego

x=1:10
y=x*x
plot(x,y)

plot(x,y,type='l') # łamana łącząca punkty

x=seq(1,10,by=.01) # więcej punktów, "wygładzenie" paraboli
y=x*x
plot(x,y,type='l')

plot(x,y,type='l',col="red") # kolor wykresu, tutaj 'red'

Listę nazw kolorów dostępnych w R można uzyskać poprzez polecenie colors(), uwaga: w ten sposób otrzymana lista jest dość długa… dlatego też ograniczymy się do wyświetlenia 6 pierwszych elementów tej listy za pomocą polecenia head:

head(colors()) # wypróbować samo polecenie colors()
## [1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"
## [5] "antiquewhite2" "antiquewhite3"

UWAGA: Kolory można podawać też za pomocą kodu hex. Wpisując w google hasło color picker lub selektor kolorów otrzymamy stronę, gdzie można ręcznie wybrać kolor, a jego kod hex pojawi się w odpowiednim polu.

x=seq(1,10,by=.01) # więcej punktów, "wygładzenie" paraboli
y=x*x
plot(x,y,type='l',col="#21b8ae") # kod hex umieszczamy w cudzysłowie, znak # jest obowiązkowy 

Osiom i wykresowi można nadać nazwy:

y=cos(x)
plot(x,y,type='l',col='red',xlab='argumenty x',ylab='cos(x)',main='Tytuł wykresu')

1.1 Dodawanie punktów lub linii do wykresu za pomocą poleceń points oraz lines, odpowiednio.

Dodawanie punktów do wykresu za pomocą points

y=x*x
plot(x,y,type='l',col='red',xlab='argumenty x',ylab='kwadrat',main='Tytuł wykresu')
x2=seq(1,10,by=.5)
y2=exp(x2)
points(x2,y2,col='blue',pch='k')
y2=x2*sqrt(x2)
points(x2,y2,col='#A689B8',pch=9)

Parametr pch powyżej służy do określenia symbolu, jaki zostanie użyty do zaznaczenia punktu na wykresie. Może to być symbol typu litera, lub znak specjalny - w pomocy ? pch znajduje się lista symboli.

Dodawanie linii do wykresu za pomocą lines

y=x*x
plot(x,y,type='l',col='red',xlab='argumenty x',ylab='kwadrat',main='Tytuł wykresu')
y2=exp(x)
lines(x,y2,col='gray')

1.2 Podzielenie okna na części

par(mfrow=c(1,2)) #podział okna graficznego na 1*2 podokna
plot(x,sin(x),type='l')
plot(x,cos(x),type='l')

1.3 Zarządzanie oknami graficznymi

W RStudio za każdym razem wywołania polecenia plot tworzone jest nowe okno graficzne, a stare okna są zachowywane. Można przechodzić między rysunkami za pomocą strzałek w lewym, górnym rogu:

  • Przycisk “Zoom” otwiera rysunek w nowym, osobnym oknie.

  • Za pomocą “Export” można zapisać aktualny rysunek do pliku.

  • “Czerwony krzyżyk” kasuje aktualny rysunek.

  • “Miotła” usuwa wszystkie rysunki

1.4 Zapisywanie grafiki.

Zapisanie grafiki, zależy głównie od posiadanego systemu operacyjnego. Można wybrać różne formaty zapisu grafiki, m.in:

jpeg jpeg()
png png()
win.metafile win.metafile() najlepszy wybór do użycia w Word
pdf pdf() najlepszy wybór do użycia w pdflatex
postscript postscript() najlepszy wybór do użycia w latex i Open Office

Dla powyższych funkcji możemy użyć między innymi takich argumentów jak: width oraz height, aby dostosować wysokość oraz szerokość grafiki (podawane wartości w pikselach). Dla formatu jpeg możemy również dodać argument quality, aby zmniejszyć lub zwiększyć poziom kompresji (podana wartość powinna być procentowa z zakresy \((0,100)\)).

Ogólna metoda, która działa niezależnie od systemu operacyjnego, polega na wykonaniu poniższego kodu:

jpeg('rplot.jpg', width = 500, height=500, quality = 70)# zapisuje grafikę w formacie jpg pod nazwą rplot
plot(x,y)
dev.off()

Możemy również podać wysokość i szerokość grafiki w cm lub mm za pomocą używając argumentu units. W tym przypadku warto również ustawić rozdzielczość używając res.

png('rplot1.png', width = 10, height=10, units = "cm", res = 300)
plot(x,y)
dev.off()

Grafika zostanie zapisana w chwilowo aktywnym katalogu, który można sprawdzić za pomocą komendy getwd(). W celu zapisania grafiki w innym wybrany katalogi można wywołać funkcję jpeq() podając ścieżkę dostępu jpeg('/Moja_ścieżka_dostępu/rplot.jpg') lub zmieniać aktualny katalog za pomocą komendy setwd().

Inny sposób zmiany aktualnego katalogu to wybranie Files i odpowiedniego katalogu w prawym dolnym oknie RStudio, a następnie kliknięcie niebieskiego trybiku i wybranie Set As Working Directory.

Warto również dodać, że możemy do tych funkcji przekazywać dodatkowe argumentu (więcej informacji w helpie) takie jak, np. width, height,… co może być przydatne, gdy chcemy mieć zapisanych wiele obrazków o takich samych wymiarach.

Gdy operujesz systemem Windows lub Mac, graficzny interfejs ułatwia zapisywanie plików.

Na systemie Windows, wystarczy kliknąć prawym przyciskiem myszki w okno wykresu i wybrać opcję np. “Zapisz jako…”.

Na systemie Mac, klikając w okno wykresy kliknij “Plik->Zapisz” (zostanie on wtedy zapisany w formacie pdf) lub “Plik->Zapisz jako”, aby zapisać w innym formacie.

1.5 Zadania - grafika

1.5.1 Zadanie - grafika

a. Narysować wykres funkcji \(\sin\) na przedziale \([0,10]\)

b. Narysować ponownie wykres funkcji \(\sin\), dodając tym razem zakres osi OY \([-1.5,1.5]\) (opcja ylim). Nadać wykresowi tytuł np “Wykres funkcji sinus”, osi OX nazwę “Kąt”, a osi OY nazwę “sinus”.

c. Dodać linię o równaniu \(y=\frac{x}{2 \pi}\) do poprzedniego wykresu za pomocą funkcji lines. Użyć np. koloru czerwonego.

d. Dodać do poprzedniego wykresu punkty o współrzędnych \((0,1.3)\) , \((1,1)\) oraz \((2,1)\) korzystając z funkcji points - punkty narysować niebieskim symbolem ‘*’.

1.5.2 Zadanie - grafika

Podzielić okno graficzne na 2*2 części i narysować:

  • wykres funkcji \(\cos\) w lewym górnym rogu

  • wykres funkcji \(\sin\) w prawym górnym rogu

  • wykres funkcji \(\exp\) w lewym dolnym rogu

  • wykres funkcji \(\log\) w prawym dolnym rogu

Nadać odpowiednie tytuły poszczególnym wykresom i zapisać wykres do pliku.

1.5.3 Zadanie - grafika

Narysować ponownie wykres funkcji kwadratowej:

x=seq(1,10,by=.01) # więcej punktów, "wygładzenie" paraboli
y=x*x
plot(x,y,type='l',col='red') # kolor wykresu, tutaj 'red'

Polecenie ? plot.default (wpisane w Console) wyświetla pomoc na temat dostępnych argumentów polecenia plot.

Korzystając z pomocy sprawdzić działanie wybranych argumentów, w tym type , log, main, sub, axes, frame.plot , pch, cex

Wykonać osobne wykresy, za każdym razem w tytule wykresu umieszczając testowany argument i jego wartość, np “axes=FALSE”.

2 Importowanie i eksportowanie danych

2.1 Dane z bibliotek

Część zbiorów danych R jest umieszczanych w odpowiednich bibliotekach. Informacje na temat innych “wbudowanych” zbiorów danych możemy uzyskać poprzez pomoc ? datasets. W ogólnym przypadku pakiet ładujemy poleceniem library("nazwa_pakietu"), a dane data("nazwa_danych").

2.2 Dane w formacie tekstowym, csv (comma separated values).

Plik csv jest popularnym formatem przechowywania danych. Niestety, format ten nie ma ustandaryzowanej struktury. Kolejne kolumny oddzielane są od siebie znakiem separującym, którym może być przecinek, średnik, tabulacja. “Kropka dziesiętna” przy zapisie liczb może być oznaczana przez znak . lub , (kropka lub przecinek).

2.2.1 Import danych za pomocą kreatora RStudio

Dla celów ćwiczeniowych należy ze strony https://home.agh.edu.pl/~bras, podstrona przedmiotu, ściągnąć plik Student_performance_data.csv i zapisać ten plik na dysku (najlepiej w swoim ulubionym folderze).

Kreator importu znajduje się w prawym górnym oknie zmiennych środowiskowych:

Import danych
Import danych

Następnie z menu importu wybieramy pierwszą pozycję:

dane tekstowe
dane tekstowe

i odszukujemy zapisany wcześniej plik Student_performance_data.csv na dysku. Pojawi się kolejne okienko, gdzie na razie nie importujemy danych przed ustawieniem odpowiednich parametrów (patrz informacja pod obrazkiem !!!)

Okno importu danych
Okno importu danych

Istotne pola:

  1. Nazwa zmiennej (ramki danych), pod którą będą dostępne dane po imporcie. Można pozostawić bez zmian.

  2. Heading Pierwsza linia zbioru danych może zawierać (i tutaj tak jest) nazwy zmiennych (kolumn) jak w ramkach danych. Tutaj tak jest, należy zmienić na YES.

  3. Pierwsza kolumna może zawierać nazwy/indeksy obserwacji. Można pozostawić bez zmian.

  4. Separator kolumn - należy zmienić na comma jeżeli jest to co innego (tutaj ustawiony jest średnik). Dolna część okna powinna się zmienić. To, jaki separator kolumn należy wybrać, zależy od pliku.

  5. Znak “kropki dziesiętnej”, należy ustawić na period, o ile jest coś innego.

  6. Pozwala na potraktowanie łańcuchów tekstu jako zmiennych jakościowych. Nie zmieniamy.

2.2.2 Podgląd danych

Wygodny podgląd danych w RStudio mamy poprzez kliknięcie lupy/tabelki w oknie Enviroment:

2.2.3 “Analiza” zaimportowanych danych

Zbiór danych zawiera informacje na temat uczniów szkół średnich szczegółowo opisując ich dane demograficzne, nawyki związane z nauką, zaangażowanie rodziców, zajęcia pozalekcyjne i wyniki w nauce. Zmienna docelowa, GradeClass, klasyfikuje oceny uczniów na różne kategorie.

W zbiorze danych mamy:

  • StudentID: Numer identyfikujący studenta,

  • Age: Wiek studenta,

  • Gender: Płeć studenta, 0 oznacza mężczyznę, a 1 kobietę,

  • Ethnicity: grupę etyczną do której należy student:

    • 0: Kaukaz,

    • 1: Afroamerykanin,

    • 2: Azjata,

    • 3: Inne.

  • ParentalEducation: Poziom wykształcenia rodziców, według poniższych oznaczeń:

    • 0: brak,

    • 1: szkoła wyższa,

    • 2: jakiś koledż,

    • 3: licencjat,

    • 4: wyżej niż licencjat,

  • StudyTimeWeekly: tygodniowy czas poświęcony nauce,

  • Absences: Liczba nieobecności w roku szkolnym,

  • Tutoring: cykl indywidualnych spotkań, 0 oznacza nie, a 1 oznacza tak,

  • ParentalSupport: poziom wsparcia rodziców według poniższych oznaczeń:

    • 0: brak,

    • 1: niski,

    • 2: umiarkowany,

    • 3: wysoki,

    • 4: bardzo wysoki.

  • Extracurricular: Uczestnictwo w dodatkowych aktywnościach, 0 oznacza nie, 1 oznacza tak,

  • Sports: aktywność sportowa, 0 oznacza nie, 1 oznacza tak,

  • Music: aktywność w działalnościach muzycznych, 0 oznacza nie, 1 oznacza tak,

  • Volunteering: wolontariat, 0 oznacza nie, 1 oznacza tak,

  • GPA: Średnia ocen,

  • GradeClass: klasyfikacja studenta na poziomie średniej ocen, tj:

    • 0: GPA\(\ge\) 3.5,
    • 1: 3.0 \(\le\) GPA \(<\) 3.5,
    • 2: 2.5 \(\le\) GPA \(<\) 3.0,
    • 3: 2.0 \(\le\) GPA \(<\) 2.5,
    • 4: GPA \(<\) 2.0

2.2.4 Zadania - import danych

Zadania dotyczące zaimportowanego zbioru danych Student_performance_data.

  1. Sprawdź jak dużo jest obserwacji w zbiorze danych.

  2. Wyświetl informacje na temat 10 studentów którzy otrzymali najwyższą średnią.

  3. Napisz funkcję sprawdzająca, czy uczeń otrzymał odpowiednią GradeClass na podstawie uzyskanej średniej ocen. Funkcja powinna zwraca listę zawierająca numery indeksów uczniów dla których nastąpiła pomyłka oraz liczbę, ile pomyłek jest w zbiorze danych.

  4. Ile procent studentów realizowało co najmniej 3 spośród 4 dodatkowych aktywności (Extracurricular, Sports, Music, Volunteering). Jaką średnią oni mieli.

  5. Oblicz współczynnik korelacji Pearsona (polecenie cor) i narysuj wykres zależności (polecenie plot) dla:

  • średniej ocen GPA oraz czasu nauki StudyTimeWeekly,

  • średniej ocen GPA oraz nieobecności Absences.

2.2.5 Import danych za pomocą polecenia read.table()

Podstawowa składnia polecenia read.table() umożliwiająca import danych jak w kreatorze wyżej ma postać (należy użyć właśnej ścieżki dostępu):

dane_studenci=read.table(file="C:\\Users\\moje\\Desktop\\Student_performance_data.csv", sep=",", dec=".",header=TRUE)

gdzie
“dane_studenci” to nazwa tworzonej ramki danych,
file - określa położenie pliku na dysku.

UWAGA: konieczne są podwójne slashe, tj \\ w określaniu lokalizacji pliku! Można też użyć / (pojedynczy)
sep, dec - określają odpowiednio separator kolumn i kropkę dziesiętną,
header - czy pierwszy wiersz zawiera nazwy zmiennych.
Więcej opcji - w pomocy.

Inny sposób wczytania danych, jeżeli dane znajdują się w bieżącym katalogu:

dane_studenci<- read.csv("Student_performance_data.csv")

2.2.6 Zadanie - wczytywanie danych

Zadanie 1

Wczytaj swoje dane z dysku za pomocą polecenia pod swoją nazwą (parametrów nie zmieniać, może to tylko zaszkodzić). Lokalizację pliku w Windows można znaleźć klikając prawym klawiszem myszy, “właściwości”, ogólne. Pamiętamy o podwójnych slashach. Sprawdzić w podglądzie danych RStudio zawartość zaimportowanej ramki danych.

Uwaga: Polecenie read.table() ma duża liczbę argumentów (a zatem i możliwości), przez co może działać wolno w przypadku dużej ilości danych. Można wtedy skorzystać z plecenia fread() z pakietu data.table.

Uwaga: w pakiecie utils znajdują się polecenia read.csv(), read.csv2() , read.delim(), read.delim() mające takie same działanie jak read.table(), ale pewne argumenty mają domyślnie zdefiniowane.

Uwaga: zamiast lokalizacji pliku na dysku można podać jego adres internetowy

3 Zapisywanie danych do pliku tekstowego

Składnia polecenia write.table() jest podobna do składni polecenia read.table. W szczególności określamy dane, plik, separator, znak kropki dziesiętnej, informacje o nagłówkach kolumn i wierszy, znak końca linii (eol). Przykładowo, zapiszemy do pliku poniższą ramkę danych:

#tworzymy przykładową ramkę danych
Francja=as.data.frame(matrix(c(12220,15310,112958,8960,12125,6596,6999,40244,6170,8233,7223,10921,46146,4661,6653,357,395,1247,279,553,2239,3111,7629,4013,3178),ncol=5))
names(Francja)=c('n.human','n.scisle','medyczne','sportowe','techniczne')
row.names(Francja)=c('Bordeaux','Lyon','Paryz','Rennes','Tuluza')
write.table(Francja, file="C:\\Users\\moje\\Desktop\\frans.csv", sep=";", dec=".",col.names=TRUE, row.names=TRUE, eol="\n")

3.1 Zadania z zapisywaniem do pliku

3.1.1 Zadanie - zapis

Otworzyć zapisany plik w notatniku i sprawdzić zawartość (czy rzeczywiście zapisała nam się ramka danych).

3.1.2 Zadanie - zapis

Zapisać ramkę danych gotowego zbioru danych iris do pliku. Otworzyć zapisany plik.

Uwagi

Polecenie

write.table(runif(10),"")
## "x"
## "1" 0.721917895134538
## "2" 0.137734582880512
## "3" 0.577125806128606
## "4" 0.574321784777567
## "5" 0.235070161055773
## "6" 0.911978310206905
## "7" 0.17729244264774
## "8" 0.113027463434264
## "9" 0.716244660317898
## "10" 0.204301963560283

“zapisuje” wektor na ekranie.

Polecenie

write.table(runif(10),"clipboard")

“zapisuje” wektor do schowka systemowego. Można je “wkleić” za pomocą ctrl+v.

4 Importowanie danych w formacie Excela i ich analiza

Dla celów ćwiczeniowych należy ze strony <https://home.agh.edu.pl/~bras>, podstrona przedmiotu, ściągnąć plik Students_performance.xlsx i zapisać ten plik na dysku (najlepiej w swoim ulubionym folderze).

4.1 Import danych za pomocą kreatora

Ponownie uruchamiamy kreator importu:

Import danych - excel
Import danych - excel

Tym razem wybieramy Excela.

Excel - to nie było trudne…
Excel - to nie było trudne…

RStudio może chcieć na tym etapie zainstalować dodatkowe pakiety (jednorazowo).

Wskazujemy odpowiedni plik na dysku (można też adres internetowy).

W kreatorze importu warto zwrócić uwagę na:

  1. można ramce danych nadać własną nazwę,

  2. pierwszy wiersz odpowiada za nazwy zmiennych, warto zaznaczyć,

  3. wybór arkusza w pliku Excela, tutaj jest i tak tylko jeden

4.2 Import danych Excel - polecenie z pakietu openxlsx

W standardowy sposób, o ile nie jest dostępny, instalujemy pakiet openxlsx.

Ładujemy pakiet poleceniem library("openxlsx").

Polecenie importu danych z pliku Students_performance.xlsx ma postać:

dane_studentow=read.xlsx("C:\\Usersxxxxxx\\Students_performance.xlsx", sheet=1), gdzie należy podać położenie pliku na dysku.

5 Importowanie danych w formacie Matlaba

Jeden ze sposobów na importowanie danych w formacie Matlab (pliki z rozszerzeniem .mat) jest wykorzystanie funkcji readMat z pakietu R.matlab.

Może być wymagane za pierwszym razem zainstalowanie pakietu R.matlab (górny pasek, Tools, InstallPackages).

Tym razem zaimportujemy dane bezpośrednio ze strony www

library("R.matlab")
#options(max.print=5000) # czytaj UWAGA poniżej
matlab1=readMat("https://home.agh.edu.pl/~bras/WPDAD/matlab_dane.mat")

Dane wczytywane są w postaci listy kolejnych obiektów importowanego pliku.

Oczywiście, można plik ściągnąć na dysk i zaimportować dane podając ścieżkę dostępu do pliku na dysku.

Zadanie 1

Co znajduje się w zaimportowanym pliku (str, summary)? Wskazówka: wartości numeryczne w pliku są losowe, nie mają żadnej interpretacji.

UWAGA: ze względu na pewne ograniczenia, może pojawić się w danych komunikat postaci “reached getOption(”max.print”) – omitted” w przypadku próby wyświetlenia całej zaimportowanej listy. W takiej sytuacji można zmienić wartość max.print jak w powyższym kodzie. Nie ma potrzeby ponownego importu, R zaakceptował dane, ale nie uważa za stosowne wyświetlania wszystkiego co użyszkodnik zechce.

5.1 Dostęp do zaimportowanych danych, typy danych…

is.list(matlab1)
## [1] TRUE
matlab1[1]# wyświetlenie pierwszego elementu listy
## $A
##           [,1]      [,2]       [,3]      [,4]
## [1,] 0.8354046 0.9431698 0.78962047 0.6534568
## [2,] 0.8357133 0.3214731 0.79918504 0.4896553
## [3,] 0.0498575 0.8064668 0.04956477 0.9728522
## [4,] 0.5458862 0.6013988 0.28319863 0.7484899
is.matrix(matlab1[1])# nie jest to macierz, choć na to wygląda
## [1] FALSE
matlab1$A # też wygląda na macierz, ale czy na pewno?
##           [,1]      [,2]       [,3]      [,4]
## [1,] 0.8354046 0.9431698 0.78962047 0.6534568
## [2,] 0.8357133 0.3214731 0.79918504 0.4896553
## [3,] 0.0498575 0.8064668 0.04956477 0.9728522
## [4,] 0.5458862 0.6013988 0.28319863 0.7484899
is.matrix(matlab1$A) # teraz już tak...
## [1] TRUE
matlab1$A[1,2] # dostęp do elementu (1,2). Typ danych jest istotny!
## [1] 0.9431698
#maltab[1][1,1]# - nie działa bo to nie jest macierz, trzeba dostać się do właściwego "poziomu" danych jak w poleceniu wyżej