1.3 MiB
Wizualizacja danych
1-2. Wprowadzenie do grafiki w R [laboratoria]
Tomasz Górecki (2021)
library(repr) # To resize plots in Jupyter
options(repr.plot.width = 16, repr.plot.height = 9)
Wprowadznie do grafiki w R
R dysponuje bardzo dużymi możliwościami w zakresie graficznej prezentacji uzyskanych wyników. Aby jednak w pełni korzystać z jego możliwości zapoznamy się wpierw z systemem prezentacji grafiki. Bazowy system graficzny dzieli każdą stronę na trzy główne obszary: marginesy zewnętrzne (_ang. outer margins), obszar rysunku (ang. figure region) oraz obszar kreślenia (ang. plot region). Obszar jaki uzyskujemy po odrzuceniu marginesów zewnętrznych nazywany jest obszarem wewnętrznym (ang. inner region).
Obszar na zewnątrz obszaru kreślenia, ale wewnątrz obszaru rysunku nazywa się marginesami rysunku (_ang. figure margins). Większość funkcji rysujących wykorzystuje obszar kreślenia do rysowania symboli graficznych oraz linii, natomiast osie oraz etykiety nanoszone są na marginesach rysunku lub marginesach zewnętrznych. Rozmiar oraz położenie marginesów kontrolowane są za pomocą funkcji par. Polecenia graficzne w R można podzielić na trzy typy: funkcje wysokiego poziomu, funkcje niskiego poziomu oraz funkcje parametrów graficznych.
Funkcje wysokiego poziomu
Tworzą nowy wykres:
- plot - wykres punktowy, najpopularniejsza funkcja graficzna, przeciążona praktycznie dla każdego obiektu,
- curve - wykres funkcji.
Każda funkcja wysokiego poziomu może zostać wywołana z parametrami:
- add = FALSE - jeżeli TRUE, nakłada wykres na już istniejący,
- axes = TRUE - jeżeli FALSE, nie rysuje osi i pudełka naokoło,
- type = 'p' - określa rodzaj wykresu. Główne typy to: 'p' - punkty, 'l' - linie bez punktów, 'b' - punkty połączone za pomocą linii, 'o' - linie oraz punkty na nich leżące, 'h' - linie pionowe, 's' oraz 'S' - linie łączą punkty (najpierw w poziomie potem w pionie lub na odwrót), 'n' - pusty wykres,
- xlim, ylim - określa początek i koniec osi,
- xlab, ylab - tytuły osi,
- main - tytuł wykresu,
- sub - podtytuł (mniejsza czcionka).
Funkcje niskiego poziomu
Funkcje takie dodają pewne elementy do już istniejącego wykresu:
- abline(a, b) - rysuje prostą $y=ax+b$,
- arrows(x0, y0, x1, y1) - dodaje strzałkę,
- legend(x, y, legend = 'legenda') - dodaje legendę,
- lines(x, y) - rysuje linię,
- points(x, y) - rysuje punkty,
- poly(x, y) - rysuje wielokąt,
- rect(x0, y0, x1, y1) - rysuje prostokąt,
- text(x, y, label = 'tekst') - dodaje 'tekst' w punkcie (x, y). Możemy dodawać opisy matematyczne (i nie tylko), których składnia opiera się na wewnętrznym systemie R zbliżonym do TEXa,
- title('tytuł') - dodaje tytuł.
Funkcje parametrów graficznych
Zmieniają oraz poprawiają wygląd okna graficznego. Większość ustawień jest kontrolowana poprzez funkcję par, która wywołana bez parametrów wyświetla bieżące ustawienia okna. Jedną z najważniejszych opcji oferowanych przez par jest podział okna graficznego. Uzyskujemy to za pomocą opcji mfrow oraz mfcol. W tym pierwszym przypadku obrazki rysowane są po wierszach, w drugim po kolumnach. Bardziej skomplikowane układy mogą być uzyskane za pomocą poleceń split.screen oraz layout.
Podstawowe parametry graficzne
- adj - Wyrównanie tekstu, 0 - do lewej, 0.5 - do środka, 1 - do prawej.
- bg - Kolor tła.
- bty - Kontroluje rodzaj obramowania rysunku. Dopuszczalne wartości to: 'n', 'o', 'l', '7', 'c', 'u', ']', gdzie 'n' oznacza brak obramowania, natomiast pozostałe parametry określają typy obramowania zgodne z wyglądem znaków, np. : 'u' - wszystkie linie poza górną.
- cex - Wielkość powiększenia symboli i tekstu.
- col - Kolor punktów, linii, tekstu oraz wypełnionych obrazków. Do kolorów można się odwoływać za pomocą nazwy lub korzystając z modelu RGB. Wszystkie 657 nazw kolorów możemy wyświetlić za pomocą funkcji colors.
#colors()
- font - Typ czcionki dla tekstu: 1 - normalna, 2 - pogrubiona, 3 - pochylona, 4 - pogrubiona i pochylona.
- lty - Określa typ linii, 0 - brak linii ('blank'), 1 - ciągła ('solid'), 2 - przerywana ('dashed'), 3 - kropkowana ('dotted'), 4 - kropka-kreska ('dotdash'), 5 - długa kreska ('longdash'), 6 - podwójna kreska ('twodash'). Poza tym istnieje możliwość określenia dowolnej linii, w taki sposób, że po kolei w liczbach szesnastkowych podajemy ile jednostek ma być wypełnionych linią, a ile pustych (maksymalnie osiem znaków, tylko parzyste długości), np:. lty = '13' oznacza linię kropkowaną.
- lwd - Grubość linii.
- pch - Symbol używany na obrazkach, można używać domyślnych symboli określonych liczbami od 0 do 25. Symbole 21-25 różnią się od wcześniejszych jedynie typem wypełnienia. Dodatkowo istnieje możliwość użycia znaków o kodach ASCII od 32 do 255 z bieżącej czcionki (wszystkie symbole dostępne do użycia można wyświetlić poleceniem symbolTable z pakietu fBasics).
par(mfrow = c(2, 2)) # Split screen
plot(cars) # Scatterplot
plot(cars$speed, cars$dist)
plot(cars, axes = FALSE)
plot(cars,
xlab = 'Speed',
ylab = 'Distance',
main = 'Plot',
sub = 'Subtitle',
pch = 20,
col = 'red',
cex = 3)
par(mfrow = c(1, 3)) # Split screen
curve(sin, from = 0, to = 2 * pi) # Create plot
curve(cos, from = 0, to = 2 * pi, add = TRUE, col = 'red', lwd = 2) # Add plot to existing
curve(sin(cos(x) * exp(-x / 2)), -10, 7) # New plot
curve(sin(cos(x) * exp(-x / 2)), -10, 7, n = 1000) # New plot
with(cars, plot(speed, pch = '*')) # Scatterplot
with(cars, lines(lowess(speed))) # Add lines
legend('bottomright', # Place
c('Speed', 'Smoothed speed'), # Text
pch = c('*', NA), # Points
lty = c(0, 1)) # Lines
parameters <- par() # Save parameters
par(bg = 'lightyellow', col.axis = 'blue') # Set new parameters
plot(cars, xlab = 'Speed', ylab = 'Distance', pch = 22, col = rgb(1, 0, 0, 0.5), bg = 'yellow')
title('The speed of cars and the distances taken to stop (1920)', font.main = 3, adj = 1)
par(parameters) # Load parameters
Warning message in par(parameters): “parametr graficzny 'cin' nie może zostać ustawiony” Warning message in par(parameters): “parametr graficzny 'cra' nie może zostać ustawiony” Warning message in par(parameters): “parametr graficzny 'csi' nie może zostać ustawiony” Warning message in par(parameters): “parametr graficzny 'cxy' nie może zostać ustawiony” Warning message in par(parameters): “parametr graficzny 'din' nie może zostać ustawiony” Warning message in par(parameters): “parametr graficzny 'page' nie może zostać ustawiony”
Podstawowe wykresy
Histogram
Histogram - zbór przylegających prostokątów, których podstawy, równe rozpiętości przedziałów klasowych znajdują się na osi odciętych, a wysokości są liczebnościami przedziałów.
par(mfrow = c(1, 3)) # Split screen
with(cars, hist(speed)) # Basic histogram
with(cars, hist(speed, prob = TRUE)) # Histogram for probabilities
with(cars, lines(density(speed), lwd = 2)) # Density
names(faithful)
with(faithful, hist(eruptions, seq(1.6, 5.2, 0.2),
prob = TRUE,
col = 'salmon'))
with(faithful, lines(density(eruptions, bw = 0.1), lwd = 2))
with(faithful, rug(jitter(eruptions), side = 1)) # Add true value below X axis
- 'eruptions'
- 'waiting'
Wykres pudełkowy
Wykres pudełkowy inaczej ramkowy (_ang. boxplot, box-and-whisker plot). Tworzymy go odkładając na pionowej osi wartości niektórych parametrów rozkładu. Nad osią umieszczony jest prostokąt (pudełko), którego dolny bok jest wyznaczony przez pierwszy kwartyl, górny bok zaś przez trzeci kwartyl. Wysokość pudełka odpowiada wartości rozstępu ćwiartkowego. Wewnątrz prostokąta znajduje się pozioma linia, określająca wartość mediany. Rysunek pudełka uzupełniamy od góry i od dołu odcinkami (wąsy). Dolny koniec dolnego odcinka wyznacza najmniejszą wartość w zbiorze, natomiast górny koniec górnego odcinka, to wartość największa. Końcowe wartości wąsów muszą spełniać dodatkowy warunek, a mianowicie dolny koniec nie może być mniejszy niż $Q_1-1{,}5\cdot(Q_3-Q_1)$, a górny większy niż $Q_3+1{,}5\cdot(Q_3-Q_1)$. Jeśli występują obserwacje spoza tego przedziału, to nanoszone są na wykres indywidualnie (są to tzw. obserwacje odstające (ang. outlier)).
par(mfrow = c(1, 3)) # Split screen
with(cars, boxplot(speed)) # Classic boxplot for single group
with(cars, boxplot(speed, horizontal = TRUE)) # Horizontal boxplot
with(cars, rug(speed, side = 1)) # Add truve values below
with(cbind(cars, group = sample(1:2, nrow(cars), replace = TRUE)),
boxplot(speed ~ group, col = c('lightblue', 'salmon'))) # Boxplot for two groups
Wykres skrzypcowy
Wykres skrzypcowy (_ang. violin plot). Można go traktować jako wygładzoną wersję wykresu pudełkowego. Przydatny jest zwłaszcza w przypadku danych wielomodalnych. Jest to w zasadzie wykres pudełkowy, gdzie szerokość skrzypiec w punkcie $x$ odpowiada natężeniu obserwacji o wartości cechy zbliżonej do $x$ (estymator jądrowy gęstości).
![](/AITech/aitech-wizualizacja/media/commit/aa499e143a10a61bfeeae958b08c4b540839b95c/figs/violin.png)
with(cars, vioplot::vioplot(speed))
Wykres słupkowy
Wykres słupkowy (kolumnowy) (_ang. bar plot) - używany raczej w przypadku danych jakościowych, przedstawia kolejne kategorie danych za pomocą słupków odpowiedniej wysokości. Może być poziomy lub pionowy (czasami występuje rozróżnienie, pionowy nazywany jest wtedy kolumnowym, a poziomy słupkowym). Czasami używa się również tzw. wykresu Pareto, gdzie słupki rysowane są od najwyższego do najniższego.
blood <- c(70, 24, 10, 3)
barplot(blood, col = 1:4)
Wykres kołowy
Wykres kołowy (_ang. pie chart). Wartości liczbowe są przedstawiane za pomocą wycinków koła. Wykres kołowy występuje w rozmaitych wariantach graficznych. Typowy jest wykres płaski, ale można też utworzyć trójwymiarowy ,,tort'' lub ,,ser''.
par(mfrow = c(1, 2))
pie(blood, col = 2:5)
plotrix::pie3D(blood, explode = 0.1)
Muliplots
layout(matrix(c(1, 2, 1, 3), ncol = 2, byrow = TRUE)) # Split screen
UsingR::squareplot(blood) # First plot
with(cars, boxplot(speed)) # Second plot
pie(blood) # Third plot
Zadania
- Dla zbioru danych _LakeHuron (poziomy jeziora (w stopach) Huron (lata 1875-1972)):
- narysuj jak zmieniał się poziom wody w czasie,
- zastosuj funkcję _identify aby oznaczyć punkty odpowiadające latom o najwyższym oraz najniższym poziomie wody.
- W zbiorze danych _emissions (emisja CO$_2$ a poziom PKB (26 państw)) z pakietu UsingR istnieje obserwacja odstająca. Znajdź ją używając funkcji identify, a następnie narysuj wykres, bez tej obserwacji. Zamiast punktów powinny być nazwy krajów. Użyj skali logarytmicznej dla obu osi.
- Dla zbioru _chips (grubość chipsów) z pakietu UsingR wykonaj wykres pudełkowy w zależności od miejsca pomiarów (powinno być 8 wykresów na jednym diagramie). Co można na ich podstawie powiedzieć o średniej i wariancji?
- Wykonaj wykres pudełkowy (w zależności od żywienia) dla zbioru _chicken (waga kurczaków w zależności od metody żywienia) z pakietu UsingR. Co można powiedzieć na temat średnich wag na podstawie tego wykresu?
- Na bazie zbioru _carbon (poziom tlenku węgla) z pakietu UsingR, wykonaj wykres pudełkowy dla każdego stanowiska pomiaru. Czy występują jakieś różnice, dlaczego?
- Narysuj wykres funkcji sinus używając jako argumentów 200 wartości z przedziału $[-\pi,\pi]$ (nie rysuj osi). Następnie dodaj oś $Y$ przechodzącą przez początek układu współrzędnych, potem oś $X$ ze znacznikami co $\pi/2$.
- W zbiorze danych _survey (wyniki ankiety (palenie, cechy fizyczne, płeć, wiek itp. wśród 237 studentów pierwszego roku na Uniwersytecie w Adelajdzie) z pakietu MASS znajduje się zmienna Exer zawierająca informacje na temat częstotliwości ćwiczenia przez studentów. Dla tej zmiennej wykonaj wykres słupkowy oraz kołowy (wraz z legendą).
- Zbiór danych _orings z pakietu DAAG zawiera dane na temat wypadków amerykańskich statków kosmicznych przed katastrofą promu Challenger (28.01.1986). Jedynie obserwacje 1, 2, 4, 11, 13 oraz 18 były analizowane przed katastrofą. Utwórz z tych obserwacji nowy zbiór danych oraz narysuj wykres całkowitej liczby wypadków w zależności od temperatury. Wykonaj podobny wykres dla całego zbioru danych i umieść oba wykresy obok siebie.
- Zbiór danych _Manitoba.lakes z pakietu DAAG zawiera informacje na temat powierzchni oraz wysokości n.p.m. 9 największych jezior w kanadyjskiej prowincji Manitoba. Narysuj wykres zależności powierzchni od wysokości n.p.m. Każde jezioro na wykresie powinno mieć nazwę. Ze względu na wartości odstające powierzchni warto skorzystać ze skali logarytmicznej.
- Dla cechy _Sepal.Width ze zbioru danych iris (cechy trzech gatunków kwiatów irysa) wykonaj wykres pudełkowy osobno dla każdego poziomu zmiennej Species. Zmodyfikuj wykres tak, aby przypominał poniższy rysunek.
![](/AITech/aitech-wizualizacja/media/commit/aa499e143a10a61bfeeae958b08c4b540839b95c/figs/lab1_1.png)
Skonstruuj macierz o 10 wierszach i 10 kolumnach wypełnioną wartościami losowymi (rozkład jednostajny) z przedziału $[0,1]$.
- Narysuj ją za pomocą funkcji _image.
- Zmień kolory na odcienie szarości.
- Wykonaj wykres konturowy za pomocą funkcji _contour.
W celu stworzenia wykresu 3d za pomocą funkcji _persp potrzebujemy trzech zmiennych (x, y, z), gdzie z jest macierzą wartości, które chcemy narysować. Wykonaj poniższy wykres (przyjmij $z = (x + y)/2$ oraz $x,y\in[0,1]$).
![](/AITech/aitech-wizualizacja/media/commit/aa499e143a10a61bfeeae958b08c4b540839b95c/figs/lab1_2.png)
- Wykonaj poniższy wykres (wykorzystaj funkcję _layout) dla zmiennych ze zbioru iris.
![](/AITech/aitech-wizualizacja/media/commit/aa499e143a10a61bfeeae958b08c4b540839b95c/figs/lab1_3.png)