1 Podstawowa grafika w R

UWAGA: Ta części laboratorium 5 dotyczy podstawowej grafiki w R. Ciekawszy jest pakiet graficzny ggplot2, którym zajmiemy się na następnych zajęciach.

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.

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: liczba 6 elementów wynika z domyślnego argumentu polecenia head, odpowiednim argumentem liczbę tę można zmienić. Odwrotne działanie: ostatnie elementy listy/wektora wyświetlamy za pomocą tail.

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.

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')

Parametr pch powyżej służy do określenia symbolu, jaki zostanie użyty do zaznaczenia punktu na wykresie

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 - sinus

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 ‘*’.

Efekt powinien być podobny do:

1.5.2 Zadanie grafika - okno 2x2

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. Efekt powinien przypominać:

1.5.3 Zadanie grafika - 2 przykłady wykresów do odesłania

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. Z wbudowanych przykładowych danych iris oraz women korzystaliśmy w Laboratorium 2. 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").

Korzystanie ze zbiorów z innych bibliotek omówimy przy okazji Laboratorium 6.

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

Zaimportowany zbiór danych zawiera rzeczywiste dane pomiarowe z jednej doby pomiaru dla 140 metrowego masztu pomiarowego.

Przykładowy masz pomiarowy, źródło: Wikipedia
Przykładowy masz pomiarowy, źródło: Wikipedia

Pod linkiem Anemometr wygląd przykładowych urządzeń pomiarowych (strona producenta)

Podstawowe informacje techniczne, czyli co mamy w tych danych:

  • Rejestrator danych zapisuje dane na karcie pamięci co 10 minut. Pojedynczy rekord (wiersz, fragment na screenie niżej) w pliku danych opisuje 5 parametrów dla każdego urządzenia: Avg - średnia z 10 minut pomiaru, Min i Max - wartości minimalne i maksymalne w ciągu 10 minut, StdDev - odchylenie standardowe, Count - liczba odczytów = 600 (czyli technicznie odczyt następuje co sekundę).

Taki pojedynczy rekord dla urządzenia “Anemometer1” ma postać: Anemometr1

  • w przypadku Count różnego od 600 możemy mieć do czynienia z usterką urządzenia pomiarowego, problemów z zasilaniem lub innych problemów technicznych

  • w przypadku niskiego St.Dev możemy mieć do czynienia z ciszą lub zamarznięciem urządzenia (np. w okresie zimowym).

  • Urządzenia opisane jako “anemometer” i/lub “wind speed” - służą do pomiaru prędkości wiatru [m/s].

  • Urządzenia opisane jako “wind vane” i/lub “wind direction” - służą do pomiaru kierunku wiatru [w stopniach].

  • czynniki atmosferyczne jak temperatura [w st. Celcjusza], ciśnienie (barometric air pressure) [chyba w hPa], wilgotność względna powietrza [w %]

  • parametry rejestratora typu napięcie [w V]

  • inne parametry (mniej istotne).

Istotne informacje:

  • wysokości zamontowanych anemometrów
    Anemometr1, 140m
    Anemometr2, 140m
    Ultrasonic, 137m
    Anemometr3, 112m
    Anemometr4, 84m

  • wysokości zamontowanych vane’ów:
    Ultrasonic, 137m
    Wind Vane 1, 137m
    Wind Vane 2, 81m

2.2.4 Zadanie - profil pionowy wiatru

Utworzyć ramkę danych zawierającą 2 kolumny: wysokość anemometru (dane wyżej) oraz średnią dobową (średnia kolumn Avg - policzyć trzeba) - 5 wierszy, bo 5 urządzeń mamy. Narysować wykres zależności średniej prędkości wiatru od wysokości (tzw profil pionowy wiatru) - polecenie typu plot(wysokosc, srednia) powinno wystarczyć. Dodać opisy osi, tytuł wykresu.

Ramka i wykres powinny przypominać te poniżej (uwaga: dane wysokości mamy w informacji maszcie pomiarowym wyżej, a dane prędkości należy samodzielnie wyliczyć, a nie przepisywać cyferki).

##   wysokosc predkosc
## 1      140 3.611029
## 2      140 3.612678
## 3      137 3.570795
## 4      112 3.569185
## 5       84 3.457780

2.2.5 Zadanie - róża wiatrów

Zainstalować pakiet o nazwie openair (Górny pasek, Tools, InstallPackages…). Narysować różę wiatrów:

library("openair") # ładowanie biblioteki
#?windRose #pomoc
windRose(dane_w1, ws="Ultrasonic.wind_speed.Avg", wd="Ultrasonic.wind_direction.Avg")# wlaściwe polecenie

2.2.6 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ć:

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

gdzie
“dane_wiatr” 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! Inne polecenia mogą wymagać użycia innych ukośników…
Można też użyć pojedynczego znaku /
sep, dec - określają odpowiednio separator kolumn i kropkę dziesiętną,
header - czy pierwszy wiersz zawiera nazwy zmiennych.
Więcej opcji - w pomocy.

2.2.6.1 Zadanie - import

Wczytaj swoje dane z dysku 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

2.2.6.2 Import danych za pomocą polecenia read.csv()

Można użyć tez plecenia:

dane_w1 <- read.csv("dane_w1.csv")

gdzie plik dane_w1.csv znajduje się w bieżacym katalogu (albo trzeba podać pełną sciężkę dostępu).

2.2.7 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 ramkę danych utworzoną w jednym z wcześniejszych laboratoriów:

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")

2.2.8 Zadanie - zapis danych

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

Uwagi

Polecenie

write.table(runif(10),"")
## "x"
## "1" 0.716010678559542
## "2" 0.374742878135294
## "3" 0.400819241767749
## "4" 0.489198772702366
## "5" 0.837871527532116
## "6" 0.945206771837547
## "7" 0.615105347242206
## "8" 0.55823859712109
## "9" 0.0128257269971073
## "10" 0.325341913616285

“zapisuje” wektor na ekranie.

Polecenie

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

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

3 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 dane_w2.xlsx i zapisać ten plik na dysku (najlepiej w swoim ulubionym folderze).

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

3.2 Analiza danych - tylko informacje techniczne. Zadania - po grafice.

Powyższe dane pochodzą z rzeczywistego pomiaru, tym razem dane z całego miesiąca. Jest to inny zestaw pomiarowy niż wcześniej, ale struktura jest podobna: średnia, odchylenie standardowe, minimum i maximum w próbce 10-minutowej.

Urządzenia (plik ze szczegółami jest “tajny”, CH - Channel, kanał):

  1. Anemometry:
    CH1, 81.00m; (backup - zapasowy)
    CH4, 80.60m;
    CH5, 60.90m;
    CH6, 40.90m

  2. Vane’y:
    CH7, 78.30m;
    CH8, 38.60m

  3. Inne:
    CH9 wilgotność
    CH10 ciśnienie
    CH11 temperatura
    CH12 napięcie w rejestratorze

3.3 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 dane_w2.xlsx ma postać:

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

4 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")
## R.matlab v3.7.0 (2022-08-25 21:52:34 UTC) successfully loaded. See ?R.matlab for help.
## 
## Dołączanie pakietu: 'R.matlab'
## Następujące obiekty zostały zakryte z 'package:base':
## 
##     getOption, isOpen
#options(max.print=5000) # czytaj UWAGA poniżej

matlab1=readMat("https://home.agh.edu.pl/~bras/R/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.

4.0.1 Zadanie

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.

4.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, choc 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
#matlab1[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