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