1 Wstęp
Do tworzenia wykresów statystycznych w R można wykorzystać jedną z popularnych bibliotek:
Pakiet graphics - najstarsze rozwiązanie dostępne w R. Kolejne funkcje graficzne dorysowują elementy wykresu.
Pakiet ggplot2 - deklaratywne podejście do tworzenia wykresów, wygodne i elastyczne. Wymaga poznania większej liczby funkcji.
Pakiet lattice - zbiór kilkunastu szablonów (lattice = krata, kratownica), wystarczających do przedstawienia typowych podsumowań danych. Względnie prosta obsługa.
2 Grafika w R - praca z pakietem lattice
2.1 Przykładowe dane
Przykładowe dane, z którymi będziemy pracować, załadujemy z pakietu Przemysława Biecka “PBImisc” (autor “Przewodnik po pakiecie R”). W przypadku pierwszego użycia tego pakietu, należy go zainstalować (w RStudio, pasek zadań-> Tools->Install Packages… - może wymagać uruchomienia RStudio w trybie administratora).
Inny sposób na instalowanie biblioteki jak w przykładzie niżej (linijka jest zakomentowana, instalujemy raz):
Na nasze potrzeby sprawdzimy “zawartość” obiektu
kidney
:
head(kidney) # sprawdzić w pomocy co robi funkcja head
mode(kidney) #typ obiektu
str(kidney) #struktura obiektu
summary(kidney) #podsumowanie
? PBImisc # informacje na temat pakietu, w szczególności zbioru danych
#"kidney" (na dole okna pomocy powinien znajdować się link "Index"
#do dalszej części dokumentacji)
2.2 Porównanie wykresów z 3 pakietów ze domyślnymi argumentami
Uwaga: pakiety lattice i ggplot2 wymagają załadowania bibliotek i być może jednorazowego zainstalowania.
2.3 Elementy wykresu w pakiecie lattice
- Użyty szablon - każdy szablon realizowany przez odpowiednią funkcję z pakietu. Listę funkcji można znaleźć w pomocy na temat pakietu (omówione zostaną w dalszej części Laboratorium):
Funkcje podzielone są na grupy: funkcje jednej zmiennej (univariate), dwóch zmiennych (bivariate), trójwymiarowe (trivariate) i wielu zmiennych (multivariate). Funkcje te i ich opcje omówimy w dalszej części. **Uwaga:** przez wykres dwóch zmiennych rozumiemy wykres, gdzie jedna ze zmiennych jest zależna (np. jest funkcją) drugiej zmiennej.
Formuła opisująca, które zmienne i w jakiej roli mają wystąpić na wykresie. Formuła składa się z 3 części: lewej strony formuły, prawej strony formuły i warunkowania. Zmienne powinny być widoczne w lokalnej przestrzeni nazw (prawe górne okno RStudio) albo odpowiadać nazwom kolumn w danych wskazanych przez argument
data
.
Składnia formuły:
zmienna objaśniana ~ zmienne objaśniające | zmienna grupująca
zmienna objaśniana
orazzmienna grupująca
może zawierać dowolną liczbę zmiennych rozdzielonych znakiem*
lub+
(znaki te można używać zamiennie)Typy zmiennych użytych w formule, od nich zależy sposób prezentacji na wykresie.
2.4 Podstawowy wykres
2.4.1 Dane do wykresu
Spróbujemy najpierw przyjrzeć się trzem wybranym elementom zbioru
kidney
, a następnie zilustrujemy dane na wykresie (chodzi o
kolumny MDRD12, MDRD7, discrepancy.DR ramki danych kidney
).
Sprawdzić w pomocy ? kidney
co opisują (mierzą) te
zmienne.
## [1] 65 62 45 60 64 45
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 8.00 42.00 51.00 52.22 62.00 153.00
## [1] 46 44 6 8 36 9
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.00 9.00 18.50 24.36 37.00 99.00
## [1] 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 2
## [38] 1 1 2 0 0 2 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 2 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1
## [75] 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 2 0 0 1 0 0 0 1 0 0 2 1 1 1 0 1 1 1
## [112] 1 0 0 0 0 1 1 2 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1
## [149] 2 2 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1
## [186] 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 2 0 1 0 0 1 0 1 2 0 1 1
## [223] 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1
## [260] 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 2 1 0 0
## [297] 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0
## [334] 1
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0000 1.0000 0.6976 1.0000 2.0000
2.4.2 Sam wykres
W ten sposób uzyskaliśmy wykres składający się z 3 paneli (zmienna
warunkująca discrepancy.DR ma 3 wartości 0, 1 oraz 2. Jest to liczba
niezgodności w antygenach DR). Na osi OY (wartości) znajdują się dane
MRDR12, na osi OX (argumenty) dane MDRD7. Jest to podstawowy wykres
kropkowy. Argument data=kidney
wskazuje, z jakiego zbioru
danych mają być pobrane dane MDRD12, MDRD7, discrepancy.DR ilustrowane
na wykresie.
Nic nie stoi na przeszkodzie, by dane do wykresu były zmiennymi globalnymi:
3 Dodatkowe argumenty -
modyfikacja wykresu xyplot
Wybrane argumenty pozwalające na modyfikowanie wykresu:
3.1 Argument
type
“p” oznacza wykres kropkowy, “smooth” - krzywa średniej ruchomej, “r”
- krzywa trendu liniowego. Wartości argumentu type
przekazywane są jako lista - ta literka c
służąca do
tworzenia listy lub wektora.
Wybrane wartości argumentu:
p
, punktyl
, linia (ciekawy efekt, jeśli dodamy do powyższego wykresu, przy wykresie funkcji sin ma to większy sens). Związane jest to z tym, że dane nie koniecznie muszą być funkcją (w standardowym sensie)b
,o
, linia i punktyh
, linie pionowe przypominające histograms
, punkty łączone są krzywą schodkowąspline
, dopasowanie splinu 3-ciego stopnia do danychg
, pomocnicze linie siatkia
, średnie w grupach połączone linią (ćwiczenie: wyjaśnić, jak działa ten argument)
3.2 Legenda, argument
key
Za pomocą argumentu auto.key=TRUE
możemy stworzyć
automatyczną legendę (uwaga, w przykładzie poniżej dodane zostały
wartości dla MDRD36)
Zamiast wartości TRUE
możemy podać listę właściwości do
zmodyfikowania:
auto.key=list(columns=2)
- legenda będzie wyświetlana w dwóch kolumnachauto.key=list(space="right")
pozycja legendy (możliwe: top, bottom, left, right)auto.key=list(title="opis legendy")
xyplot(MDRD12+ MDRD36 ~ MDRD7, data = kidney, type=c("p","spline"),
auto.key=list(columns=2,
space="bottom",
title = "opis legendy - dwie zmienne"))
3.3 Opisy osi, wykresu
Argumenty xlab="text"
, ylab="text2"
pozwalają na zmianę nazw osi, zamiast standardowych pobieranych z
formuły wykresu. Można też usunąć opis osi przez xlab=NULL
.
Argument main="opis wykresu"
pozwala na nadanie
wykresowi nagłówka. Standardowo ma wartość NULL
(brak
nagłówka).
xyplot(MDRD12+ MDRD36 ~ MDRD7, data = kidney,
type=c("p","spline"),
xlab="oś iksów",
ylab="oś igrek",
main="Tytuł wykresu jest jak każdy widzi")
Uwaga: w przypadku dłuższych formuł przydatne jest rozbicie ich na kilka linijek, co zwiększa przejrzystość jak w kodzie powyżej.
Przydatny może być pakiet latex2exp
umożliwiający
używanie wyrażeń TeXa do tworzenia opisów osi/wykresów. Pakiet wymaga
zainstalowania (jednorazowo) i załadowania biblioteki. Warto zwrócić
uwagę na main
w poniższym przykładzie - mieszanka tekstu i
wyrażeni matematycznych ograniczonych standardowymi znakami $ TeXa:
library("latex2exp")
xyplot(MDRD12+ MDRD36 ~ MDRD7, data = kidney, type=c("p","spline"),
xlab="oś iksów",
ylab=TeX(r'($\alpha x^\alpha, \ \ \frac{1}{x}$)'),
main=TeX(r'(Using $\LaTeX$ for plotting in base graphics! $\alpha=\beta$)',
bold=TRUE))
3.4 Argumenty
xlim
, ylim
Argumenty te pozwalają na kontrolowanie wartości na obu osiach, są zadawane jako dwuwymiarowe wektory oznaczające lewy i prawy koniec przedziału na osiach
xyplot(MDRD12+ MDRD36 ~ MDRD7, data = kidney, type=c("p","spline"),
xlim=c(20,50), ylim=c(50,100),pch=25)
3.5 Argument
pch, cex
Do zmiany symbolu znacznika na wykresie można wykorzystać argument
pch
, który może przyjmować wartości od 0 do 25 (liczbowe)
lub pojedyncze znaki (ograniczone przez cudzysłów, np. “k”). Lista
symboli dostępna jest w pomocy przez ? pch
. Argument
pch
może przyjąć jako wartość wektor, określający znacznik
dla każdego zestawu wartości oddzielnie.
Argument cex
kontroluje rozmiar znacznika
xyplot(MDRD12+ MDRD36 ~ MDRD7,
data = kidney,
type=c("p","spline"),
xlim=c(20,50),
ylim=c(50,100),
pch=25,
cex=2)
4 Mechanizm warunkowania i mechanizm grupowania
4.1 Mechanizm warunkowania
Mechanizm warunkowania (poprzez symbol | w formule dla wykresu) pozwala na przedstawienie danych na osobnych panelach (tutaj w przykładzie na 3 panelach, gdzie zmienna warunkująca discrepancy.DR ma 3 różne wartości).
4.2 Mechanizm grupowania
Mechanizm grupowania - argument group
- pozwala na
przedstawienie tych samych danych na jednym wykresie, jak w przykładzie
niżej (podział ponownie determinuje zmienna discrepancy.DR)
xyplot(MDRD36 ~ MDRD7,group=discrepancy.DR, data = kidney, type="p",
cex=1,pch=4,auto.key = list(column=3))
5 Przegląd szablonów pakietu lattice
UWAGA:
Zaprezentowane w poniższych materiałach funkcje/opcje stanowią ułanek opcji/możliwości. Internet jest ogromnym zasobem wiedzy i odpowiedzi na pojawiające się pytania - choć czasem jest problem z odpowiednim sformułowaniem pytania (kolega tak mówi).
5.1 Wykres kropkowy,
funkcja xyplot()
.
Funkcja ta omówiona była dość szczegółowo we wcześniejszej części
5.2 Wykres kropkowy,
funkcja splom()
Funkcja splom()
służy do rysowania macierzy wykresów
kropkowych:
Dołożymy dwa argumenty, pozwalające na sterowanie rozmiarem czcionki opisu zmiennych (dla potrzeb tego opisu czcionki zmniejszymy):
Pierwszym argumentem funkcji splom()
nie jest formuła,
jak w xyplot()
, a ramka danych zawierająca zmienne
ilościowe. Argument type
działa podobnie, jak w przypadku
xyplot()
- poprzednie zajęcia.
5.3 Wykres paskowy,
funkcja stripplot()
Wykres paskowy pokazuje, jak zmienia się zmienna ilościowa dla różnych grup opisanych przez zmienną jakościową.
Uwaga:
## int [1:334] 2 4 2 3 1 1 2 2 3 3 ...
## Factor w/ 5 levels "0","1","2","3",..: 3 5 3 4 2 2 3 3 4 4 ...
Zadanie:
Jakie jest działanie argumentów jitter.data
oraz
alpha
w powyższym przykładzie? Przetestować ich działanie
zmieniając wartości argumentów
5.4 Wykres pudełkowy,
funkcja bwplot
Wykres pudełkowy, inaczej wykres typu ramka-wąsy (b - box? w - whiskers?). Info: lewy koniec wąsa - minimum, początek pudełka - pierwszy kwartyl, kropka lub kreska pionowa w pudełku - mediana, koniec pudełka - trzeci kwartyl, prawy wąs - maksimum. Kropki poza głównym wykresem - obserwacje odstające (Zadanie: co to są obserwacje odstające?).
Argument varwidth=TRUE
za pomocą szerokości pudełka
obrazuje rozmiar porównywanych grup (różnica stosunkowo niewielka, ale
jest):
Inny przykład: podzielenie discrepancy.AB
na 3
przedziały
discrepancy<-equal.count(kidney$discrepancy.AB, number=3)
bwplot(therapy~MDRD12|discrepancy,
data=kidney,
varwidth=TRUE)
5.5 Wykres kropkowy i
paskowy, funkcja dotplot()
Tablicę zliczeń (krzyżowych, kontyngencji) możemy wykorzystać funkcje
table()
:
library("Przewodnik")
(wPlec=table(daneSoc$wyksztalcenie,daneSoc$plec)) #dodatkowy, zewnętrzny nawias
##
## kobieta mezczyzna
## podstawowe 22 71
## srednie 16 39
## wyzsze 10 24
## zawodowe 7 15
Do graficznej prezentacji takich danych można wykorzystać funkcję
dotplot()
, tutaj w podstawowej wersji:
oraz nieco bardziej zaawansowanej:
Zadanie/pytania:
- za co odpowiada argument
groups
? - dla przypomnienia, co to jest
type="o"
? - Do powyższego obrazka dodać tytuł wykresu, opisy osi, umieścić legendę po prawej stronie
5.6 Wykres kropkowy i
paskowy, funkcja barchart()
attach(daneSoc) #wczytanie danych
tablica=as.data.frame(table(wyksztalcenie,plec,praca))
#potrzebujemy ramkę danych
tablica #wyświetlenie...
## wyksztalcenie plec praca Freq
## 1 podstawowe kobieta nie pracuje 2
## 2 srednie kobieta nie pracuje 4
## 3 wyzsze kobieta nie pracuje 1
## 4 zawodowe kobieta nie pracuje 0
## 5 podstawowe mezczyzna nie pracuje 20
## 6 srednie mezczyzna nie pracuje 12
## 7 wyzsze mezczyzna nie pracuje 5
## 8 zawodowe mezczyzna nie pracuje 8
## 9 podstawowe kobieta uczen lub pracuje 20
## 10 srednie kobieta uczen lub pracuje 12
## 11 wyzsze kobieta uczen lub pracuje 9
## 12 zawodowe kobieta uczen lub pracuje 7
## 13 podstawowe mezczyzna uczen lub pracuje 51
## 14 srednie mezczyzna uczen lub pracuje 27
## 15 wyzsze mezczyzna uczen lub pracuje 19
## 16 zawodowe mezczyzna uczen lub pracuje 7
Zadanie:
- dostosować wykres jak poprzednio (osie, tytuł itp.)
5.7 Wykres profili,
funkcja parallelplot()
Funkcja parallelplot
jest nowszą wersją funkcji
parallel
. Pozwala na przedstawienie profilu zmienności
wielu cech jednocześnie
parallelplot(~kidney[,c(9:16)],
groups=MDRD7<30,
alpha=0.2,
horizontal.axis=FALSE,
scales=list(x=list(rot=90)),
data=kidney)
Zadania:
- Jakie jest działanie “nowych” argumentów w powyższym poleceniu
(
horizontal.axis
,scales
)? - Jaki jest efekt grupowania poprzez
group=MDRD7
? - Wykres składa się z dużej ilości linii, ze względu na liczbę
obserwacji w zbiorze danych
kidney
. Jak zaprezentować na wykresie wybrane wiersze (np. od 5 do 15)? Usunąć przy okazji mechanizm grupowania.
5.8 Histogram, funkcja
histogram()
Podstawowy histogram oraz z warunkowaniem otrzymane za pomocą funkcji
histogram()
:
Przydatna może być informacja o danych, w celu lepszego doboru przedziałów klasowych
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.00 9.00 18.50 24.36 37.00 99.00
Modyfikacja przedziałów, (ujemne wartości tylko ilustracyjnie) podział równomierny:
oraz podział nierównomierny:
Zmiana sposobu wyświetlania paneli poprzez argument
layout
:
Zadanie: sprawdzić efekt działania
layout
dla innych wartości.
5.9 Wykres gęstości,
funkcja densityplot()
Wykres gęstości rozkładu w podstawowej postaci:
oraz z warunkowaniem i dodatkowymi argumentami:
Inne modyfikacje
densityplot(~MDRD7,
group=factor(diabetes),
par.settings = list(superpose.line = list(col = c("blue","red"))),
data=kidney,
bw=8,
from=0,to=80,
plot.points=FALSE,
auto.key=TRUE)
Zadanie:
- Narysować wykres gęstości warunkowany przez
discrepancy.AB
, tak aby panele były ułożone poziomo obok siebie oraz (druga wersja) pionowo jeden pod drugim
5.10 Wykres dystrybuanty
empirycznej, funkcja ecdfplot
z pakietu
latticeExtra
Wywołanie funkcji:
Zadanie
Narysować wykres dystrybuanty empirycznej wykorzystując warunkowanie i grupowanie
5.11 Wykresy kwantylowe,
funkcje qqmath()
i qq()
Funkcja qqmath
służy do przedstawienia wykresu
kwantylowego zgodności z rozkładem zadanym przez argument
distribution
.
Wygenerujemy próbkę 500 obserwacji z rozkładu normalnego i porównamy z rozkładem normalnym i wykładniczym
Podobnie, tym razem próbka z rozkładu wykładniczego
Uwaga: literka ‘q’ przy rozkładach związana jest z kwantylami rozkładu. Inne rozkłady można znaleźć w pomocy.
Funkcja qq()
służy do konstrukcji wykresu kwantylowego
przedstawiającego zgodność rozkładu zmiennej w dwóch grupach. Po lewej
stronie formuły musi być podana zmienna z dokładnie
dwoma poziomami:
Zadanie:
Jak interpretować uzyskane wykresy?
6 Zadania
6.1 Zadanie 1
Zaimportować plik danych
dane_w2.xlsx
Na podstawie danych
CH7Avg
wskazań wiatrowskazu (kierunku wiatru) utworzyć nowy wektor (np.sektor
), który przyjmie wartości znakoweN
,E
,S
,W
, w zależności od wartościCh7Avg
w następujący sposób:
N
, gdyCh7Avg
jest mniejsze niż 45 lub większe niż 315
E
, gdyCh7Avg
jest większe niż 45 i mniejsze niż 135
S
, gdyCh7Avg
jest większe niż 135 i mniejsze niż 225
W
, gdyCh7Avg
jest większe niż 225 i mniejsze niż 315
(domknąć przedziały z jednej strony). Wskazówka: było takie zadanie, gdzie losowaliśmy wektor z rozkładu jednostajnego i na jego podstawie budowaliśmy wektor o wartościach 0 lub 1, w zależności czy wylosowano liczbę mniejszą czy większą od 0.5.Utworzyć ramkę danych zawierająca jedynie dane:
date
, wskazaniaCh4Avg
,Ch5Avg
,Ch6Avg
,Ch7Avg
, oraz utworzonysektor
. Ramka powinna wyglądać mniej więcej tak (tutaj tylko 6 pierwszych wierszy):
## date anemo_80m anemo_60m anemo_40m kierunek_80m sector ## 1 2010-08-01 00:00:00 4.6 5.3 4.8 62 E ## 2 2010-08-01 00:10:00 4.7 4.8 4.8 69 E ## 3 2010-08-01 00:20:00 5.1 4.8 4.5 83 E ## 4 2010-08-01 00:30:00 5.5 4.4 3.1 93 E ## 5 2010-08-01 00:40:00 5.0 3.8 2.6 89 E ## 6 2010-08-01 00:50:00 4.2 3.3 2.3 92 E
6.2 Zadanie 2
Korzystając z powyższej ramki narysować wykresy (zadbać o tytuły wykresów, kolory, legendy itp szczegóły wykresów):
jeden wykres (liniowy) wskazań anemometrów CH4, CH5 i CH6 w zależności od
date
wykres punktowy wskazań anemometrów CH4 w zależności od
date
i sektora (4 panele, warunkowanie)wykres punktowy wskazań anemometrów CH4, CH5 i CH6 w zależności od
date
i sektora (4 panele, warunkowanie)wykres punktowy wskazań anemometrów CH4, CH5, CH6 w zależności od
date
wykorzystując grupowanie (3 panele, 4 serie kolorów). Powinno wyjść:
narysować wykres ramka-wąsy (
bwplot
) dla wskazań anemometru CH4narysować wykres ramka-wąsy (
bwplot
) dla wskazań anemometru CH4 z podziałem na sektory (4 ramki na jednym rysunku)narysować wykres macierzowy między wskazaniami CH4, CH5 i CH6. Porównać z macierzą korelacji dla tych danych (polecenie
cor
)narysować wykres kwantylowy (
qqmath
) zgodności CH4 z rozkładem normalnymnarysować wykres kwantylowy (
qqmath
) zgodności CH4 z rozkładem Weibulla o parametrach wyestymowanych przy okazji poprzedniego laboratorium. Dostęp do rozkładu Weibulla (parametrdistribution
wqqmath
) o zadanych parametrach poprzezfunction(p) qweibull(p,shape=???,scale=???)
gdziep
jest argumentem funkcji i nie zmieniamy, a w miejsce???
wstawiamy swoje wartości.