1 Grafika w R - praca z
pakietem ggplot2
1.1 O pakiecie
ggplot2
Jest to pakiet do tworzenia grafiki statystycznej. Cechą wyróżniającą
pakiet ggplot jest jego gramatyka, która pozwala tworzyć wykresy poprzez
łączenie niezależnych komponentów (niczym układanie puzzli). Wszystkie
wykresy składają się z danych, czyli informacji, które chcemy
wizualizować oraz opisu sposobu mapowania danych. Istnieje 5
komponentów:
Warstwa to elementy geometryczne i
przekształcenia statystyczne.
elementy geometryczne - reprezentują to, co faktycznie widać na
wykresie. Zaczynają się od geom_…
elementy statystyczne - podsumowują dane, np. dopasowanie modelu,
utworzenie histogramu, grupowanie danych, itp. Zaczynają się od słowa
stat_…
Skale mapują wartości w przestrzeni danych na
wartości w przestrzeni estetycznej. Obejmuje to użycie koloru, kształtu
lub rozmiaru. Skale rysują również legendę i osie.
Coord, czyli układ współrzędnych, opisuje sposób
mapowania współrzędnych danych na płaszczyznę grafiki. Zapewnia również
osie i linie siatki, które pomagają odczytać wykres.
Aspekt określa sposób dzielenia i wyświetlania
podzbiorów danych jako małych wielokrotności.
Motyw kontroluje najdrobniejsze szczegóły
wyświetlania, takie jak rozmiar czcionki i kolor tła.
My w tym laboratorium skupimy się przede wszystkim na
Warstwach.
Możliwości pakietu ggplot2 są olbrzymie, omawiamy tutaj tylko
podstawy. Internet jest pełen poradników i przykładów, choćby:
Teoretycznie wszystko można pisać “ciągiem”, jednak zasada “jedno
polecenie/geometria - jedna linijka” zwiększa czytelność kodu.
2 Warstwy
Na początku musisz przekazać ramkę danych do funkcji
ggplot i określić aes, czyli estetyki, które
określają zmienne mapowania. Mapowanie, w skrócie, dotyczy określenia,
które zmienne i w jaki sposób zostaną odwzorowane na wykresie.
library(ggplot2) #na początku ładujemy bibliotekę
wart_x=seq(0,10, by=0.1)
wart_y=sin(wart_x)
wart_z=cos(wart_x)
df = data.frame(time=wart_x,sin=wart_y,cos=wart_z) # Tworzymy ramkę danych
ggplot(df, aes(x = time, y = sin))

Aby “coś” pojawiło się na wykresie, należy dodać warstwę
odpowiadającą za wybraną reprezentację danych za pomocą znaku plus
+ oraz geometrii geom_.
2.1 Pojedyńcze
geometrie
Geometrie są podstawowymi elementami ggplot2 i określają w jaki
sposób dane są wizualizowane.
Na przykład:
ggplot(df, aes(x = time, y = sin)) + #linia kończy się znakiem plus, co oznacza "ciąg dalszy nastąpi w następnej linijce"
geom_line() #właściwe polecenie odpowiadające na rysowaniu

Uwagi - w powyższym przykładzie
ramkę danych przekazywaną do funkcji ggplot() można
poprzedzić nazwą argumentu data, tzn. data=df
lub umieścić ją jako pierwszy argument
praktycznie, ramkę danych data oraz funkcję
aes można przekazać też na poziomie warstwy
geom_line(), tzn. poniższe polecenie też zadziała i da taki
sam efekt:
Różnica polega na tym, że dostęp do danych df ma tylko
warstwa geom_line.
Uwaga: można zbudować wykres bazujący na różnych
ramkach w osobnych geometriach.
2.2 Wybrane
geometrie
geom_abline, geom_hline, geom_vline - linie proste,
ukośne, poziome lub pionowe
geom_bar - słupki, rysowane obok siebie lub
poustawiane na sobie
geom_contour - kontury, przydatne do opisu
powierzchni w 3D
geom_density - obszar oznaczający ocenę jądrowego
estymatora gęstości
geom_errorbar, geom_errorbarh - słupki
błędów pionowe lub poziome
geom_histogram - histogram
geom_linerange - pionowe odcinki
geom_point, geom_jitter - kropki,
wykres rozproszenia
geom_rect prostokąty o zadanych
współrzędnych
geom_rug - znaczniki na marginesie wykresu
geom_smooth - krzywa, często trend
geom_text - napisy, etykiety obserwacji
geom_bin2d - kwadraty wykorzystywane do prezentacji
mapy ciepła
geom_boxplot - wykresy pudełkowe
geom_line - łamana
Jak widać, możliwości jest sporo, na tym oraz w kolejnych
laboratoriach omówimy niektóre z nich.
2.3 Składanie
geometrii
Możemy nakładać wiele warstw na jeden rysunek, poprzez dodawanie
operatorem + kolejnych geometrii. Dla przykładu dwa wykresy
w jednym oknie:

Odpalając helpa do dowolnej geometrii, w naszym przypadku
?geom_line znajdziemy różne opcje modyfikacji, jak na
przykład, zmianę koloru, przezroczystości, kształtu, rozmiaru, np.:
ggplot(df, aes(x=time,y=sin))+
geom_line(color="red", alpha=0.6, size=1.5)+
geom_line(aes(x=time,y=cos), color="blue", linetype = "dotdash")

Aby móc odróżnić wykresy, często chcemy, aby wykresy miały legendę. W
ggplot2 legendy są generowane automatycznie na podstawie
estetyki (takiej jak kolor, kształt, rozmiar itp.), która jest mapowana
wewnątrz funkcji aes(). W przypadku ustawienia estetyki
poza funkcją aes() (np. color = "zmienna"
bezpośrednio w funkcji geom_line()), ggplot2 uznaje ją za
estetykę stałą i nie tworzy dla niej legendy. Następnie używamy funkcji
scale_color_manual("zmienna"="kolor") dla której argument
values powinien mapować nazwy zmiennych z
aes() na żądane kolory. Popatrz na przykład poniżej.
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus"), linetype="dotdash")+
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue"))

Gdy wewnątrz funkcji aes() dodamy więcej ustawień
estetyki to utworzy nam się więcej legend. Zauważmy, że najlepiej jest
trzymać się jednolitych oznaczeń w ramach wywołań funkcji
geom_line(), to znaczy:
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(values = c("sinus" = "solid", "cosinus" = "dotdash"))

W przypadku, gdy nie chcemy mieć dwóch legend, możemy wyświetlić
tylko jedną manewrując argumentem guide="none":
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(values = c("sinus" = "solid", "cosinus" = "dotdash"), guide = "none")

Uwaga: W tym przypadku w legendzie niebieska linia
nie jest przerywana, czyli nie dziedziczymy typu linii. Aby połączyć 2
legendy, trzeba im nadać taką samą nazwę (parametr name w
scale_):
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(name="Legenda",values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(name="Legenda",values = c("sinus" = "solid", "cosinus" = "dotdash"))

2.4 Tworzenie
adnotacji
Aby zmodyfikować nazwę wykres, osi, legendę można użyć funkcji
labs(), np.:
ggplot(df, aes(x=time,y=sin))+
geom_line(color="red")+
geom_line(aes(x=time,y=cos), color="blue")+
labs(title="Wykres funkcji trygonometrycznych",
x="Dziedzina",
y="Wartości")

2.4.1 Zadanie
Utworzyć jeden rysunek, na którym znajdą się wykresy 4 różnych
funkcji (np. \(\sin 2x\), \(\frac{1}{4}(x-1)(x+1)\), \(e^{-x^2}\), \(\mathrm{arctg} x\)), gdzie \(x\in[-\pi, \pi]\).
Uwzględnić elementy:
różne kolory. Można użyć kodu hex koloru używając
color="#12FAA0, koloru w rgb w skali od 0 do 1 za pomocą
color=rgb(0.1,0.7,0.2) lub od 0 do 255
color=rgb(5,128,144,maxColorValue = 255) albo jego nazwy -
lista poprzez colors(). Dla przypomnienia, wpisanie hasła
color picker w Google pozwala na wybór koloru, jego kodu hex i
rgb.
wybrane style linii (pomoc ? linetype)
wspólna legenda
opis osi, tytuł rysunku
wybrać odpowiedni przedział (nie za krótki, by było widać
ewentualną okresowość, ale też nie da duży, by wartości np. funkcji
kwadratowej nie były zbyt duże).
Przykładowy wykres
2.5 Statystyki i
agregacje
Każda warstwa ma określony dodatkowy atrybut - statystykę, czyli
funkcję agregującą dane:
- np. dla wykresu punktowego
geom_point statystyka ta to
funkcja identycznościowa, czyli “nic nie robi”
- np. dla wykresu słupkowego
geom_bar domyślnie wywołuję
statystykę stat_count zliczającą wystąpienia np. liter, jak
w przykładzie:
moje_dane <- data.frame(
kategoria = c("A", "B", "D", "C", "B", "B", "D", "E", "C", "C", "A", "B")
)
ggplot(moje_dane, aes(kategoria))+geom_bar()

Tutaj mamy tylko jeden atrybut (kategorię), a zliczanie działa
automatycznie.
- Niektóre statystyki można parametryzować, np.
geom_smooth, kilka przykładów:
Do zilustrowania tego użyjemy zestawu danych countries z
pakietu Przewodnik.
## country birth.rate death.rate population continent
## 1 Afghanistan 34.1 7.7 30552 Asia
## 2 Albania 12.9 9.4 3173 Europe
## 3 Algeria 24.3 5.7 39208 Africa
## 4 Andorra 8.9 8.4 79 Europe
## 5 Angola 44.1 13.9 21472 Africa
## 6 Antigua and Barbuda 16.5 6.8 90 Americas

Funkcja geom_smooth() domyślenie (dla danych z mniej niż
1000 punktami) używa metody LOESS, która jest lokalną regresją
nieliniową. Dopasowuje ona krzywą na podstawie sąsiednich punktów. Dla
większej liczby danych (powyżej 1000 punktów) ggplot użyje uproszczonej
metody GAM.
W przypadku, gdy nie chcemy przedziałów ufności możemy użyć
argumentów, jakie daje nam funkcja geom_smooth(). Możemy
również wybrać prostą wyrysowywaną z wykorzystaniem regresji
liniowej.
#Przetestuj poniższy kod
ggplot(countries, aes(birth.rate, death.rate))+
geom_point()+
geom_smooth(se=FALSE, method='lm')# bez przedziałów ufności
2.5.1 Zadanie
Wypróbować w powyższym przykładzie inne argumenty dla funkcji
geom_smooth w szczególności takie jak span i
formula - sprawdzić w pomocy do czego służą.
Można dodać też inne parametry, jak kolor warstwy itp:
library(MASS)
ggplot(countries, aes(birth.rate, death.rate))+
geom_point()+
geom_smooth(se=FALSE, span = 0.2)
# Wygładzanie przy użyciu lokalnego wygładzania loess z bardziej szczegółowym wygładzaniem (span = 0.2).
ggplot(countries, aes(birth.rate, death.rate)) +
geom_point() +
geom_smooth(se = FALSE, method = 'lm', formula = y ~poly(x,2)) #wygładzanie przy użyciu regresji liniowej lm z formułą dla wielomianu drugiego stopnia.
2.6 Mapowanie
Wykresy przedstawiają kolekcje obiektów, które są opisane przez
atrybuty graficzne. Mapowania określają, które atrybuty wykresów kodują,
które zmienne ze zbioru z danymi.
Dwa przykłady mapowania zmiennych. W pierwszym przypadku dodatkowo w
aes (=eng. aestethic) podajemy parametr
color, który zmienną continent odwzoruje za
pomocą koloru na wykresie kropkowym.
Do zilustrowania tego użyjemy ponownie zestawu danych
countries z pakietu Przewodnik.

UWAGA: Dodanie w aes czegoś innego poza
x i y skutkuje automatycznym dodaniem
legendy.
UWAGA: Poprzez aes przekazujemy, które
zmienne z ramki danych countries oraz w jaki sposób mają
być reprezentowane na wykresie. W powyższym przykładzie na osi
x jest to birth.rate, na osi y
jest to death.rate. Zmienna continent
odwzorowywana jest na wykresie za pomocą koloru.
Można dodać inne mapowanie, np. odwzorowujące populację jako wielkość
kropek w wykresie punktowym:

W przypadku odwzorowania zmiennej ciągłej za pomocą koloru pojawia
się gradient koloru:
#Przetestuj poniższy kod
ggplot(countries,aes(x=birth.rate, y=death.rate, color=birth.rate))+
geom_point(size=3)
Możliwa jest też podanie mapowania dla samej warstwy, jak i zadanie
wartości argumentów (tutaj i wyżej size) - poniżej
aes pojawia się jako argument funkcji
geom_point i daje skutek jak wyżej. Istotne
jest, że mapowanie dotyczy tylko aktualnej geometrii, poniżej
przykład:
#Przetestuj poniższy kod
ggplot(countries,aes(x=birth.rate, y=death.rate))+
geom_point(size=3,aes(color=birth.rate))
Przedstawimy teraz powyższe dane, używając geometrii
geom_violin(), która tworzy tzw. wykres skrzypcowy.
Wykres skrzypcowy składa się z dwóch symetrycznych części
przypominających klepsydrę lub skrzypce (stąd też jego nazwa). Każda z
tych części pokazuje, ile danych znajduje się w różnych zakresach
wartości – im szersza część wykresu, tym więcej danych przypada na dany
przedział wartości, co obrazuje rozkład danych.
Dodatkowo na tym samym wykresie umieścimy punkty
geom_points, które reprezentują rzeczywiste wartości
danych.
Dzięki takiemu wykresowi możemy porównać rozmieszczenie danych
(birth.rate) między różnymi grupami
(continent).

Zauważmy, że nałożyliśmy tutaj dwie geometrię. Sprawdź, że bez
geom_point() powyższy kod da nam tylko wykresy
skrzypcowe.
W przypadku, gdy podamy argument aes(color=continent) do
funkcji geom_point() to tylko kropki będą miały kolor
odpowiadający kontynentowi, natomiast obrys wykresy skrzypcowego
pozostanie nie zmieniony, tj czarny.:
#Przetestuj poniższy kod
ggplot(countries,aes(x=continent, y=birth.rate))+
geom_violin()+
geom_point(aes(color=continent)) # tylko punkty będą pokolorowane zgodnie z odpowiadającymi in kontynentami.
2.6.1 Inne przykłady
mapowania
Oczywiście rozrzut wartości pomiędzy różnymi wartościami można
zauważy za pomocą innych wykresów, jak np:
geom_point() ,
geom_boxplot() ,
geom_dotplot() ,
geom_violin().
Więcej o interpretacji wykresów na kolejnych laboratoriach.
# Przetestuj poniższy kod
szkielet=ggplot(countries,aes(continent, birth.rate,color=continent, fill=continent)) #wszystko w R może być obiektem...
szkielet+geom_point()
szkielet+geom_boxplot()
szkielet+geom_dotplot(binaxis="y",stackdir="centerwhole", dotsize = 0.6)#help geom_dotplot, co to jest binaxis i stackdir? jak można je zmodyfikować?
szkielet+geom_violin(scale="width") # co robi ten dodatkowy argument?
2.7 Od statystyki do
geometrii
Wykorzystywaliśmy dotychczas fakt (np. przy geom_bar),
że geometria korzysta z domyślnej statystyki zliczającej. Ale też
statystyki mają swoje domyślne geometrie.
Zadanie: jaki efekt/zadanie/działanie ma w poniższym
przykładzie statystyka stat_ellipse?

2.7.1 Zadanie
Zapytać wujka Google co to jest “confidence ellipse”
2.8 Podział okna ze
względu na czynnik
Panel typu facet_grid( ~b) podział w kolumnach na
podstawie czynnika b , tutaj kontynentu:
ggplot(countries, aes(x=birth.rate, y=death.rate))+
stat_ellipse()+
geom_point()+
facet_grid(~continent)

Panel typu face_grid( a~.) podział w wierszach na
podstawie czynnika a . UWAGA: ta kropka
jest obowiązkowa w tej konfiguracji!
# Przetestuj poniższy kod
ggplot(countries, aes(x=birth.rate, y=death.rate))+
stat_ellipse()+
geom_point()+
facet_grid(continent~.)
Inne opcje:
facet_grid(a ~b) panele w kolumnach na podstawie
czynnika b, a w wierszach na podstawie czynnika
a
facet_wrap(~b) panele na prostokątnej siatce na
podstawie czynnika b
Inny przykład:
ggplot(countries, aes(x=birth.rate, y=death.rate))+
geom_point(data=countries[,c(-1,-5)],size=0.5,color="lightblue")+
stat_ellipse(color="red4")+
geom_point(size=2, color="red")+
facet_grid(~continent)

2.8.1 Zadanie
Zidentyfikować w powyższym kodzie, które elementy odpowiadają za
odpowiednie składniki powyższego wykresu. W szczególności wyjaśnić
działanie data=countries[,c(-1,-5)] w tym przykładzie.
3 Modyfikowanie
wykresu
3.1 Modyfikowanie wykresu
za pomocą scale
Modyfikowanie automatycznych ustawień wykresu może zostać wykonane za
pomocą “skali” (eng. scale). Np. scale_shape_xxxx
służy zmianie kształtu, np:
scale_shape_manual(values=LETTERS) - zmiana
znaczników na litery,
scale_shape_discrite(solid=TRUE) - zmiana tej
wartości na FALSE powoduje zmianę znaczników na
puste.
Aby zobaczyć listę możliwych modyfikacji wystarczy zacząć wpisawanie
w kodzie R lub w konsoli np. scale_shape_ i poczekać na
autouzupełnianie komendy.
Przetestuj je na poniższym przykładzie
rys1=ggplot(countries, aes(x=birth.rate, y=death.rate, shape=continent))+
geom_point()
rys1 #obiekt ggplot jest jak każdy inny w R, można go przypisać do zmiennej rys1

Inne przykładami zmiany skali są np:
scale_X_reverse() - odwraca skalę na osi x,
scale_x_sqrt() - skala pierwiastkowa na osi
x,
scale_x_log10() - skala logarytmiczna na osi
x,
scale_x_continuous(breaks=c(...)) - dodaje linie
pomocnicze w podanych punktach,
`scale_x_continuous(breaks=c(...), limits=c()) -
dodaje linie pomocnicze plus zmiana zakresu na osi.
# Przetestuj poniższy kod
x=c(1:20)
df <- data.frame(x=x, y=10^x)
rys2=ggplot(df, aes(x=x, y=y))+geom_point()
rys2
#rys2+scale_x_reverse()#odwrócenie skali na osi x
#rys2+scale_x_sqrt() # skala pierwiastkowa
rys2+scale_x_log10() # skala logarytmiczna
#rys2+scale_x_continuous(breaks=c(1,2,5,10,50)) # linie pomocnicze
#rys2+scale_x_continuous(breaks=c(10,20,21,22), limits=c(5,25)) # linie pomocnicze plus zmiana zakresu na osi
3.1.1 Zadanie
Na wspólnym rysunku narysuj wykresy funkcji: \(x^2\), \(3\cdot
x^2\), \(x^3\), \(0.1 \cdot x^3\).
Użyj przedziału \([0.01,5]\) dla
argumentów, np. x=seq(0.01,5, length.out=1001)
Nadaj liniom wybrane kolory i stwórz legendę
Zmień skale osi na logarytmiczne dla obu osi
Co się stało z wykresem? W szczególności - jaki wpływ ma potęga
na kształt wykresu oraz współczynnik przy potędze?
Przykładowy wykres

3.2 Modyfikacja układu
współrzędnych i osi
Przykładowymi funkcjami, które modyfikują układ współrzędnych są:
coord_trans() - transformacja osi,
coord_fixed() - proporcjonalne jednostki na obu
osiach względem zadanej skali,
coord_flip() - zamiana osi,
coord_cartesioan() - kartezjański układ
współrzędnych,
coord_polar() - biegunowy układ
współrzędnych,
coord_map() - rzutuje część ziemi która jest
sferyczna na płaszczyznę 2D.
# Przetestuj poniższy kod
rys2+coord_trans(y="log2", x="log2")
rys2+coord_trans( y="log2")
rys2+coord_fixed()# proporcjonalne jednostki na obu osiach
rys2+coord_fixed(ratio=6)# zajrzeć do pomocy
rys2+coord_flip()
3.3 Themes
Możemy zmienić globalne ustawienia dotyczące wyglądu wykresu. Jeden
ze sposobów to wykorzystanie motywów - theme. W pakiecie
jest kilka zdefiniowanych motywów:
theme_bw() - biały - dobry do druku,
theme_dark() - ciemny
Więcej motywów w pakiecie ggthemes takich jak na
przykład:
them_tufte()
them_excel()
them_excel_new()
Najwygodniej jest przetestować je wykorzystując poniższy kod.
library("ggthemes")
rys2+theme_tufte()+ggtitle("theme_tufte")
rys2+theme_excel()
rys2+theme_excel_new()
?ggthemes
Możemy też zmienić wybrane elementy wykresu. Używając funkcji
theme (w nawiasie kolejne opcje):
ggplot()+
geom_point(data=countries, aes(x=birth.rate, y=death.rate, color=continent))+
labs(title="Dodatkowo zmienione tło wykresu")+
theme(
plot.title = element_text(face = "bold", size = (25),color="steelblue"),
panel.background = element_rect(fill = 'floralwhite')
)

4 Zadania
4.1 Zadanie 1 - wykres i
jego modyfikacje
Ponownie zaczniemy od wykresu podstawowego, tym razem gęstości kilku
rozkładów normalnych (o wybranych parametrach) - kopiuj/wklej:
x<-seq(-3.1,5.1, by =.01)
y1=dnorm(x)
y2=dnorm(x,sd=2)
y3=dnorm(x,sd=1/2)
y4=dnorm(x,mean=2)
xx=as.data.frame(cbind(x,y1, y2, y3, y4))
ggplot(xx)+
geom_line(aes(x,y1,color="N(0,1)"),size=2)+
geom_line(aes(x,y2,color="N(0,4)"),size=2)+
geom_line(aes(x,y3,color="N(0,1/4)"),size=2)+
geom_line(aes(x,y4,color="N(2,1)"),size=2)+
scale_color_manual(name="opis",
breaks=c('N(0,1)', 'N(0,4)', 'N(0,1/4)', 'N(2,1)'),
values=c('N(0,1)'='blue', 'N(0,4)'='red', 'N(0,1/4)'='green', 'N(2,1)'='orange'))

4.1.1 Zadanie 1a -
modyfikacja osi
Za pomocą theme zmodyfikować osie wykresu:
większa czcionka przy etykietach osi
obrócenie etykiet osi “y”
usunięcie nazw osi
tak aby zyskać efekt:
Wskazówka: Warto spojrzeć na przydatny
link.

4.1.2 Zadanie 1b -
modyfikacja tła
Jak w zadaniu wyżej, zmienić kolor tła, główne linie siatki,
pomocnicze linie siatki, obramowanie poprzez themes tak,
aby uzyskać efekt jak niżej. Nazwy parametrów do zmiany to:
panel.border
panel.background
panel.grid.major
panel.grid.minor
Wskazówka: Przydatny
link.
Efekt powinien przypominać:

4.1.3 Zadanie 1c -
modyfikacja legendy
Teraz zmieniamy poprzez theme:
rozmiar czcionki tytułu legendy - tutaj tekstu “opis”,
legend.title
rozmiar czcionki elementów legendy,
legend.text
wyrównanie tekstu “opis” na środkowe (center),
legend.title.align
położenie legendy - ma być wewnątrz wykresu,
legend.position
ramka wokół legendy, kolorowa, pogrubiona,
legend.box.background
tło legendy pod znacznikami, tutaj jest floralwhite
lepiej aby był jednolity z resztą tła, legend.key
tło legendy, tutaj floralwhite,
legend.background
Wskazówka: Przydatny
link

4.2 Zadanie 2
Wstęp: dane i kod kopiuj/wklej
Zaczniemy od importu danych w formacie Excela z Laboratorium
4 (możliwe, że trzeba będzie zmienić katalog):
library(ggplot2)
library(readxl)
Students_performance <- read_excel("Students_performance.xlsx")
head(Students_performance)
## # A tibble: 6 × 15
## StudentID Age Gender Ethnicity ParentalEducation StudyTimeWeekly Absences
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1001 17 1 0 2 19.8 7
## 2 1002 18 0 0 1 15.4 0
## 3 1003 15 0 2 3 4.21 26
## 4 1004 17 1 0 3 10.0 14
## 5 1005 17 1 0 2 4.67 17
## 6 1006 18 0 0 1 8.19 0
## # ℹ 8 more variables: Tutoring <dbl>, ParentalSupport <dbl>,
## # Extracurricular <dbl>, Sports <dbl>, Music <dbl>, Volunteering <dbl>,
## # GPA <dbl>, GradeClass <dbl>
W Laboratorium 4 znajdziemy tez opis, co która zmienna
oznacza.
Zauważmy, że pewne kolumny “liczbowe” służą do kodowania np. płci
(zmienna Gender), w związku z czym możliwe jest policzenie
## [1] 0.5108696
co oczywiście sensu nie ma. Dlatego też wybrane zmienne liczbowe
zamienimy na zmienne jakościowe (co później pozwoli na odpowiednie ich
wykorzystanie przy wykresach):
Students_performance$Gender=as.factor(Students_performance$Gender)
Students_performance$Ethnicity=as.factor(Students_performance$Ethnicity)
Students_performance$ParentalEducation=as.factor(Students_performance$ParentalEducation)
Students_performance$Tutoring=as.factor(Students_performance$Tutoring)
Students_performance$ParentalSupport=as.factor(Students_performance$ParentalSupport)
Students_performance$Extracurricular=as.factor(Students_performance$Extracurricular)
Students_performance$Sports=as.factor(Students_performance$Sports)
Students_performance$Music=as.factor(Students_performance$Music)
Students_performance$Volunteering=as.factor(Students_performance$Volunteering)
Teraz polecenie
## [1] NA
jest niewykonalne (i o to chodziło). Cały czas ma sens polecenie
## 0 1
## 1170 1222
Zadania:
w każdym z poniższych wykresów nadać odpowiedni tytuł
wykresu
narysować wykres punktowy zależności GPA (oś y) od
StudyTimeWeekly (oś x)

- narysować wykres punktowy zależności
GPA (oś y) od
StudyTimeWeekly (oś x) i za pomocą kolorów zilustrować
czynnik ParentalSupport, a za pomocną kształtu znacznika
shape czynnik Gender (na jednym rysunku)

- narysować wykres punktowy zależności
GPA (oś y) od
StudyTimeWeekly (oś x) i zastosować podział na panele
względem czynnika ParentalEducation w wierszach i
Ethnicity w kolumnach. Dodatkowo, można też wykorzystać
parametr labeller funkcji facet_grid (sprawdź
w pomocy jak działa ten parametr i przykłady jego zastosowania).

- narysować wykres
boxplot zmiennej
StudyTimeWeekly w wersji pionowej”. Rysunek powinien
wyglądać jak niżej.

- na powyższym wykresie skala na osi “x” nie ma sensu - usunąć ją
(zmiana w
theme)

- narysować wykres
boxplot zmiennej GPA z
podziałem (kolorami) ze względu na Ethnicity

- narysować wykres
boxplot zmiennej GPA z
podziałem (kolorami) ze względu na ParentalEducation

- narysować wykres
boxplot zmiennej GPA z
podziałem (kolorami) ze względu na ParentalSupport

czy na podstawie ostatnich trzech wykresów można wysunąć jakieś
wnioski
narysować wykres boxplot zmiennej GPA z
podziałem (kolorami) ze względu na Gender oraz na panele ze
względu na Ethnicity

1 Grafika w R - praca z pakietem ggplot2
1.1 O pakiecie ggplot2
Jest to pakiet do tworzenia grafiki statystycznej. Cechą wyróżniającą pakiet ggplot jest jego gramatyka, która pozwala tworzyć wykresy poprzez łączenie niezależnych komponentów (niczym układanie puzzli). Wszystkie wykresy składają się z danych, czyli informacji, które chcemy wizualizować oraz opisu sposobu mapowania danych. Istnieje 5 komponentów:
Warstwa to elementy geometryczne i przekształcenia statystyczne.
elementy geometryczne - reprezentują to, co faktycznie widać na wykresie. Zaczynają się od geom_…
elementy statystyczne - podsumowują dane, np. dopasowanie modelu, utworzenie histogramu, grupowanie danych, itp. Zaczynają się od słowa stat_…
Skale mapują wartości w przestrzeni danych na wartości w przestrzeni estetycznej. Obejmuje to użycie koloru, kształtu lub rozmiaru. Skale rysują również legendę i osie.
Coord, czyli układ współrzędnych, opisuje sposób mapowania współrzędnych danych na płaszczyznę grafiki. Zapewnia również osie i linie siatki, które pomagają odczytać wykres.
Aspekt określa sposób dzielenia i wyświetlania podzbiorów danych jako małych wielokrotności.
Motyw kontroluje najdrobniejsze szczegóły wyświetlania, takie jak rozmiar czcionki i kolor tła.
My w tym laboratorium skupimy się przede wszystkim na Warstwach.
Możliwości pakietu ggplot2 są olbrzymie, omawiamy tutaj tylko podstawy. Internet jest pełen poradników i przykładów, choćby:
Teoretycznie wszystko można pisać “ciągiem”, jednak zasada “jedno polecenie/geometria - jedna linijka” zwiększa czytelność kodu.
2 Warstwy
Na początku musisz przekazać ramkę danych do funkcji
ggplot i określić aes, czyli estetyki, które
określają zmienne mapowania. Mapowanie, w skrócie, dotyczy określenia,
które zmienne i w jaki sposób zostaną odwzorowane na wykresie.
library(ggplot2) #na początku ładujemy bibliotekę
wart_x=seq(0,10, by=0.1)
wart_y=sin(wart_x)
wart_z=cos(wart_x)
df = data.frame(time=wart_x,sin=wart_y,cos=wart_z) # Tworzymy ramkę danych
ggplot(df, aes(x = time, y = sin))Aby “coś” pojawiło się na wykresie, należy dodać warstwę
odpowiadającą za wybraną reprezentację danych za pomocą znaku plus
+ oraz geometrii geom_.
2.1 Pojedyńcze
geometrie
Geometrie są podstawowymi elementami ggplot2 i określają w jaki
sposób dane są wizualizowane.
Na przykład:
ggplot(df, aes(x = time, y = sin)) + #linia kończy się znakiem plus, co oznacza "ciąg dalszy nastąpi w następnej linijce"
geom_line() #właściwe polecenie odpowiadające na rysowaniu

Uwagi - w powyższym przykładzie
ramkę danych przekazywaną do funkcji ggplot() można
poprzedzić nazwą argumentu data, tzn. data=df
lub umieścić ją jako pierwszy argument
praktycznie, ramkę danych data oraz funkcję
aes można przekazać też na poziomie warstwy
geom_line(), tzn. poniższe polecenie też zadziała i da taki
sam efekt:
Różnica polega na tym, że dostęp do danych df ma tylko
warstwa geom_line.
Uwaga: można zbudować wykres bazujący na różnych
ramkach w osobnych geometriach.
2.2 Wybrane
geometrie
geom_abline, geom_hline, geom_vline - linie proste,
ukośne, poziome lub pionowe
geom_bar - słupki, rysowane obok siebie lub
poustawiane na sobie
geom_contour - kontury, przydatne do opisu
powierzchni w 3D
geom_density - obszar oznaczający ocenę jądrowego
estymatora gęstości
geom_errorbar, geom_errorbarh - słupki
błędów pionowe lub poziome
geom_histogram - histogram
geom_linerange - pionowe odcinki
geom_point, geom_jitter - kropki,
wykres rozproszenia
geom_rect prostokąty o zadanych
współrzędnych
geom_rug - znaczniki na marginesie wykresu
geom_smooth - krzywa, często trend
geom_text - napisy, etykiety obserwacji
geom_bin2d - kwadraty wykorzystywane do prezentacji
mapy ciepła
geom_boxplot - wykresy pudełkowe
geom_line - łamana
Jak widać, możliwości jest sporo, na tym oraz w kolejnych
laboratoriach omówimy niektóre z nich.
2.3 Składanie
geometrii
Możemy nakładać wiele warstw na jeden rysunek, poprzez dodawanie
operatorem + kolejnych geometrii. Dla przykładu dwa wykresy
w jednym oknie:

Odpalając helpa do dowolnej geometrii, w naszym przypadku
?geom_line znajdziemy różne opcje modyfikacji, jak na
przykład, zmianę koloru, przezroczystości, kształtu, rozmiaru, np.:
ggplot(df, aes(x=time,y=sin))+
geom_line(color="red", alpha=0.6, size=1.5)+
geom_line(aes(x=time,y=cos), color="blue", linetype = "dotdash")

Aby móc odróżnić wykresy, często chcemy, aby wykresy miały legendę. W
ggplot2 legendy są generowane automatycznie na podstawie
estetyki (takiej jak kolor, kształt, rozmiar itp.), która jest mapowana
wewnątrz funkcji aes(). W przypadku ustawienia estetyki
poza funkcją aes() (np. color = "zmienna"
bezpośrednio w funkcji geom_line()), ggplot2 uznaje ją za
estetykę stałą i nie tworzy dla niej legendy. Następnie używamy funkcji
scale_color_manual("zmienna"="kolor") dla której argument
values powinien mapować nazwy zmiennych z
aes() na żądane kolory. Popatrz na przykład poniżej.
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus"), linetype="dotdash")+
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue"))

Gdy wewnątrz funkcji aes() dodamy więcej ustawień
estetyki to utworzy nam się więcej legend. Zauważmy, że najlepiej jest
trzymać się jednolitych oznaczeń w ramach wywołań funkcji
geom_line(), to znaczy:
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(values = c("sinus" = "solid", "cosinus" = "dotdash"))

W przypadku, gdy nie chcemy mieć dwóch legend, możemy wyświetlić
tylko jedną manewrując argumentem guide="none":
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(values = c("sinus" = "solid", "cosinus" = "dotdash"), guide = "none")

Uwaga: W tym przypadku w legendzie niebieska linia
nie jest przerywana, czyli nie dziedziczymy typu linii. Aby połączyć 2
legendy, trzeba im nadać taką samą nazwę (parametr name w
scale_):
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(name="Legenda",values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(name="Legenda",values = c("sinus" = "solid", "cosinus" = "dotdash"))

2.4 Tworzenie
adnotacji
Aby zmodyfikować nazwę wykres, osi, legendę można użyć funkcji
labs(), np.:
ggplot(df, aes(x=time,y=sin))+
geom_line(color="red")+
geom_line(aes(x=time,y=cos), color="blue")+
labs(title="Wykres funkcji trygonometrycznych",
x="Dziedzina",
y="Wartości")

2.4.1 Zadanie
Utworzyć jeden rysunek, na którym znajdą się wykresy 4 różnych
funkcji (np. \(\sin 2x\), \(\frac{1}{4}(x-1)(x+1)\), \(e^{-x^2}\), \(\mathrm{arctg} x\)), gdzie \(x\in[-\pi, \pi]\).
Uwzględnić elementy:
różne kolory. Można użyć kodu hex koloru używając
color="#12FAA0, koloru w rgb w skali od 0 do 1 za pomocą
color=rgb(0.1,0.7,0.2) lub od 0 do 255
color=rgb(5,128,144,maxColorValue = 255) albo jego nazwy -
lista poprzez colors(). Dla przypomnienia, wpisanie hasła
color picker w Google pozwala na wybór koloru, jego kodu hex i
rgb.
wybrane style linii (pomoc ? linetype)
wspólna legenda
opis osi, tytuł rysunku
wybrać odpowiedni przedział (nie za krótki, by było widać
ewentualną okresowość, ale też nie da duży, by wartości np. funkcji
kwadratowej nie były zbyt duże).
Przykładowy wykres
2.5 Statystyki i
agregacje
Każda warstwa ma określony dodatkowy atrybut - statystykę, czyli
funkcję agregującą dane:
- np. dla wykresu punktowego
geom_point statystyka ta to
funkcja identycznościowa, czyli “nic nie robi”
- np. dla wykresu słupkowego
geom_bar domyślnie wywołuję
statystykę stat_count zliczającą wystąpienia np. liter, jak
w przykładzie:
moje_dane <- data.frame(
kategoria = c("A", "B", "D", "C", "B", "B", "D", "E", "C", "C", "A", "B")
)
ggplot(moje_dane, aes(kategoria))+geom_bar()

Tutaj mamy tylko jeden atrybut (kategorię), a zliczanie działa
automatycznie.
- Niektóre statystyki można parametryzować, np.
geom_smooth, kilka przykładów:
Do zilustrowania tego użyjemy zestawu danych countries z
pakietu Przewodnik.
## country birth.rate death.rate population continent
## 1 Afghanistan 34.1 7.7 30552 Asia
## 2 Albania 12.9 9.4 3173 Europe
## 3 Algeria 24.3 5.7 39208 Africa
## 4 Andorra 8.9 8.4 79 Europe
## 5 Angola 44.1 13.9 21472 Africa
## 6 Antigua and Barbuda 16.5 6.8 90 Americas

Funkcja geom_smooth() domyślenie (dla danych z mniej niż
1000 punktami) używa metody LOESS, która jest lokalną regresją
nieliniową. Dopasowuje ona krzywą na podstawie sąsiednich punktów. Dla
większej liczby danych (powyżej 1000 punktów) ggplot użyje uproszczonej
metody GAM.
W przypadku, gdy nie chcemy przedziałów ufności możemy użyć
argumentów, jakie daje nam funkcja geom_smooth(). Możemy
również wybrać prostą wyrysowywaną z wykorzystaniem regresji
liniowej.
#Przetestuj poniższy kod
ggplot(countries, aes(birth.rate, death.rate))+
geom_point()+
geom_smooth(se=FALSE, method='lm')# bez przedziałów ufności
2.5.1 Zadanie
Wypróbować w powyższym przykładzie inne argumenty dla funkcji
geom_smooth w szczególności takie jak span i
formula - sprawdzić w pomocy do czego służą.
Można dodać też inne parametry, jak kolor warstwy itp:
library(MASS)
ggplot(countries, aes(birth.rate, death.rate))+
geom_point()+
geom_smooth(se=FALSE, span = 0.2)
# Wygładzanie przy użyciu lokalnego wygładzania loess z bardziej szczegółowym wygładzaniem (span = 0.2).
ggplot(countries, aes(birth.rate, death.rate)) +
geom_point() +
geom_smooth(se = FALSE, method = 'lm', formula = y ~poly(x,2)) #wygładzanie przy użyciu regresji liniowej lm z formułą dla wielomianu drugiego stopnia.
2.6 Mapowanie
Wykresy przedstawiają kolekcje obiektów, które są opisane przez
atrybuty graficzne. Mapowania określają, które atrybuty wykresów kodują,
które zmienne ze zbioru z danymi.
Dwa przykłady mapowania zmiennych. W pierwszym przypadku dodatkowo w
aes (=eng. aestethic) podajemy parametr
color, który zmienną continent odwzoruje za
pomocą koloru na wykresie kropkowym.
Do zilustrowania tego użyjemy ponownie zestawu danych
countries z pakietu Przewodnik.

UWAGA: Dodanie w aes czegoś innego poza
x i y skutkuje automatycznym dodaniem
legendy.
UWAGA: Poprzez aes przekazujemy, które
zmienne z ramki danych countries oraz w jaki sposób mają
być reprezentowane na wykresie. W powyższym przykładzie na osi
x jest to birth.rate, na osi y
jest to death.rate. Zmienna continent
odwzorowywana jest na wykresie za pomocą koloru.
Można dodać inne mapowanie, np. odwzorowujące populację jako wielkość
kropek w wykresie punktowym:

W przypadku odwzorowania zmiennej ciągłej za pomocą koloru pojawia
się gradient koloru:
#Przetestuj poniższy kod
ggplot(countries,aes(x=birth.rate, y=death.rate, color=birth.rate))+
geom_point(size=3)
Możliwa jest też podanie mapowania dla samej warstwy, jak i zadanie
wartości argumentów (tutaj i wyżej size) - poniżej
aes pojawia się jako argument funkcji
geom_point i daje skutek jak wyżej. Istotne
jest, że mapowanie dotyczy tylko aktualnej geometrii, poniżej
przykład:
#Przetestuj poniższy kod
ggplot(countries,aes(x=birth.rate, y=death.rate))+
geom_point(size=3,aes(color=birth.rate))
Przedstawimy teraz powyższe dane, używając geometrii
geom_violin(), która tworzy tzw. wykres skrzypcowy.
Wykres skrzypcowy składa się z dwóch symetrycznych części
przypominających klepsydrę lub skrzypce (stąd też jego nazwa). Każda z
tych części pokazuje, ile danych znajduje się w różnych zakresach
wartości – im szersza część wykresu, tym więcej danych przypada na dany
przedział wartości, co obrazuje rozkład danych.
Dodatkowo na tym samym wykresie umieścimy punkty
geom_points, które reprezentują rzeczywiste wartości
danych.
Dzięki takiemu wykresowi możemy porównać rozmieszczenie danych
(birth.rate) między różnymi grupami
(continent).

Zauważmy, że nałożyliśmy tutaj dwie geometrię. Sprawdź, że bez
geom_point() powyższy kod da nam tylko wykresy
skrzypcowe.
W przypadku, gdy podamy argument aes(color=continent) do
funkcji geom_point() to tylko kropki będą miały kolor
odpowiadający kontynentowi, natomiast obrys wykresy skrzypcowego
pozostanie nie zmieniony, tj czarny.:
#Przetestuj poniższy kod
ggplot(countries,aes(x=continent, y=birth.rate))+
geom_violin()+
geom_point(aes(color=continent)) # tylko punkty będą pokolorowane zgodnie z odpowiadającymi in kontynentami.
2.6.1 Inne przykłady
mapowania
Oczywiście rozrzut wartości pomiędzy różnymi wartościami można
zauważy za pomocą innych wykresów, jak np:
geom_point() ,
geom_boxplot() ,
geom_dotplot() ,
geom_violin().
Więcej o interpretacji wykresów na kolejnych laboratoriach.
# Przetestuj poniższy kod
szkielet=ggplot(countries,aes(continent, birth.rate,color=continent, fill=continent)) #wszystko w R może być obiektem...
szkielet+geom_point()
szkielet+geom_boxplot()
szkielet+geom_dotplot(binaxis="y",stackdir="centerwhole", dotsize = 0.6)#help geom_dotplot, co to jest binaxis i stackdir? jak można je zmodyfikować?
szkielet+geom_violin(scale="width") # co robi ten dodatkowy argument?
2.7 Od statystyki do
geometrii
Wykorzystywaliśmy dotychczas fakt (np. przy geom_bar),
że geometria korzysta z domyślnej statystyki zliczającej. Ale też
statystyki mają swoje domyślne geometrie.
Zadanie: jaki efekt/zadanie/działanie ma w poniższym
przykładzie statystyka stat_ellipse?

2.7.1 Zadanie
Zapytać wujka Google co to jest “confidence ellipse”
2.8 Podział okna ze
względu na czynnik
Panel typu facet_grid( ~b) podział w kolumnach na
podstawie czynnika b , tutaj kontynentu:
ggplot(countries, aes(x=birth.rate, y=death.rate))+
stat_ellipse()+
geom_point()+
facet_grid(~continent)

Panel typu face_grid( a~.) podział w wierszach na
podstawie czynnika a . UWAGA: ta kropka
jest obowiązkowa w tej konfiguracji!
# Przetestuj poniższy kod
ggplot(countries, aes(x=birth.rate, y=death.rate))+
stat_ellipse()+
geom_point()+
facet_grid(continent~.)
Inne opcje:
facet_grid(a ~b) panele w kolumnach na podstawie
czynnika b, a w wierszach na podstawie czynnika
a
facet_wrap(~b) panele na prostokątnej siatce na
podstawie czynnika b
Inny przykład:
ggplot(countries, aes(x=birth.rate, y=death.rate))+
geom_point(data=countries[,c(-1,-5)],size=0.5,color="lightblue")+
stat_ellipse(color="red4")+
geom_point(size=2, color="red")+
facet_grid(~continent)

2.8.1 Zadanie
Zidentyfikować w powyższym kodzie, które elementy odpowiadają za
odpowiednie składniki powyższego wykresu. W szczególności wyjaśnić
działanie data=countries[,c(-1,-5)] w tym przykładzie.
2.1 Pojedyńcze geometrie
Geometrie są podstawowymi elementami ggplot2 i określają w jaki sposób dane są wizualizowane.
Na przykład:
ggplot(df, aes(x = time, y = sin)) + #linia kończy się znakiem plus, co oznacza "ciąg dalszy nastąpi w następnej linijce"
geom_line() #właściwe polecenie odpowiadające na rysowaniu Uwagi - w powyższym przykładzie
ramkę danych przekazywaną do funkcji
ggplot()można poprzedzić nazwą argumentudata, tzn.data=dflub umieścić ją jako pierwszy argumentpraktycznie, ramkę danych
dataoraz funkcjęaesmożna przekazać też na poziomie warstwygeom_line(), tzn. poniższe polecenie też zadziała i da taki sam efekt:
Różnica polega na tym, że dostęp do danych df ma tylko
warstwa geom_line.
Uwaga: można zbudować wykres bazujący na różnych ramkach w osobnych geometriach.
2.2 Wybrane geometrie
geom_abline, geom_hline, geom_vline- linie proste, ukośne, poziome lub pionowegeom_bar- słupki, rysowane obok siebie lub poustawiane na sobiegeom_contour- kontury, przydatne do opisu powierzchni w 3Dgeom_density- obszar oznaczający ocenę jądrowego estymatora gęstościgeom_errorbar,geom_errorbarh- słupki błędów pionowe lub poziomegeom_histogram- histogramgeom_linerange- pionowe odcinkigeom_point,geom_jitter- kropki, wykres rozproszeniageom_rectprostokąty o zadanych współrzędnychgeom_rug- znaczniki na marginesie wykresugeom_smooth- krzywa, często trendgeom_text- napisy, etykiety obserwacjigeom_bin2d- kwadraty wykorzystywane do prezentacji mapy ciepłageom_boxplot- wykresy pudełkowegeom_line- łamana
Jak widać, możliwości jest sporo, na tym oraz w kolejnych laboratoriach omówimy niektóre z nich.
2.3 Składanie geometrii
Możemy nakładać wiele warstw na jeden rysunek, poprzez dodawanie
operatorem + kolejnych geometrii. Dla przykładu dwa wykresy
w jednym oknie:
Odpalając helpa do dowolnej geometrii, w naszym przypadku
?geom_line znajdziemy różne opcje modyfikacji, jak na
przykład, zmianę koloru, przezroczystości, kształtu, rozmiaru, np.:
ggplot(df, aes(x=time,y=sin))+
geom_line(color="red", alpha=0.6, size=1.5)+
geom_line(aes(x=time,y=cos), color="blue", linetype = "dotdash")Aby móc odróżnić wykresy, często chcemy, aby wykresy miały legendę. W
ggplot2 legendy są generowane automatycznie na podstawie
estetyki (takiej jak kolor, kształt, rozmiar itp.), która jest mapowana
wewnątrz funkcji aes(). W przypadku ustawienia estetyki
poza funkcją aes() (np. color = "zmienna"
bezpośrednio w funkcji geom_line()), ggplot2 uznaje ją za
estetykę stałą i nie tworzy dla niej legendy. Następnie używamy funkcji
scale_color_manual("zmienna"="kolor") dla której argument
values powinien mapować nazwy zmiennych z
aes() na żądane kolory. Popatrz na przykład poniżej.
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus"), linetype="dotdash")+
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue"))Gdy wewnątrz funkcji aes() dodamy więcej ustawień
estetyki to utworzy nam się więcej legend. Zauważmy, że najlepiej jest
trzymać się jednolitych oznaczeń w ramach wywołań funkcji
geom_line(), to znaczy:
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(values = c("sinus" = "solid", "cosinus" = "dotdash"))W przypadku, gdy nie chcemy mieć dwóch legend, możemy wyświetlić
tylko jedną manewrując argumentem guide="none":
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(values = c("sinus" = "solid", "cosinus" = "dotdash"), guide = "none")Uwaga: W tym przypadku w legendzie niebieska linia
nie jest przerywana, czyli nie dziedziczymy typu linii. Aby połączyć 2
legendy, trzeba im nadać taką samą nazwę (parametr name w
scale_):
ggplot(df, aes(x = time)) +
geom_line(aes(y = sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
geom_line(aes(y = cos, color = "cosinus", linetype = "cosinus")) +
scale_color_manual(name="Legenda",values = c("sinus" = "red", "cosinus" = "blue")) +
scale_linetype_manual(name="Legenda",values = c("sinus" = "solid", "cosinus" = "dotdash"))2.4 Tworzenie adnotacji
Aby zmodyfikować nazwę wykres, osi, legendę można użyć funkcji
labs(), np.:
ggplot(df, aes(x=time,y=sin))+
geom_line(color="red")+
geom_line(aes(x=time,y=cos), color="blue")+
labs(title="Wykres funkcji trygonometrycznych",
x="Dziedzina",
y="Wartości")2.4.1 Zadanie
Utworzyć jeden rysunek, na którym znajdą się wykresy 4 różnych funkcji (np. \(\sin 2x\), \(\frac{1}{4}(x-1)(x+1)\), \(e^{-x^2}\), \(\mathrm{arctg} x\)), gdzie \(x\in[-\pi, \pi]\).
Uwzględnić elementy:
różne kolory. Można użyć kodu hex koloru używając
color="#12FAA0, koloru w rgb w skali od 0 do 1 za pomocącolor=rgb(0.1,0.7,0.2)lub od 0 do 255color=rgb(5,128,144,maxColorValue = 255)albo jego nazwy - lista poprzezcolors(). Dla przypomnienia, wpisanie hasła color picker w Google pozwala na wybór koloru, jego kodu hex i rgb.wybrane style linii (pomoc
? linetype)wspólna legenda
opis osi, tytuł rysunku
wybrać odpowiedni przedział (nie za krótki, by było widać ewentualną okresowość, ale też nie da duży, by wartości np. funkcji kwadratowej nie były zbyt duże).
Przykładowy wykres
2.5 Statystyki i agregacje
Każda warstwa ma określony dodatkowy atrybut - statystykę, czyli funkcję agregującą dane:
- np. dla wykresu punktowego
geom_pointstatystyka ta to funkcja identycznościowa, czyli “nic nie robi” - np. dla wykresu słupkowego
geom_bardomyślnie wywołuję statystykęstat_countzliczającą wystąpienia np. liter, jak w przykładzie:
moje_dane <- data.frame(
kategoria = c("A", "B", "D", "C", "B", "B", "D", "E", "C", "C", "A", "B")
)
ggplot(moje_dane, aes(kategoria))+geom_bar()Tutaj mamy tylko jeden atrybut (kategorię), a zliczanie działa automatycznie.
- Niektóre statystyki można parametryzować, np.
geom_smooth, kilka przykładów:
Do zilustrowania tego użyjemy zestawu danych countries z
pakietu Przewodnik.
## country birth.rate death.rate population continent
## 1 Afghanistan 34.1 7.7 30552 Asia
## 2 Albania 12.9 9.4 3173 Europe
## 3 Algeria 24.3 5.7 39208 Africa
## 4 Andorra 8.9 8.4 79 Europe
## 5 Angola 44.1 13.9 21472 Africa
## 6 Antigua and Barbuda 16.5 6.8 90 Americas
Funkcja geom_smooth() domyślenie (dla danych z mniej niż
1000 punktami) używa metody LOESS, która jest lokalną regresją
nieliniową. Dopasowuje ona krzywą na podstawie sąsiednich punktów. Dla
większej liczby danych (powyżej 1000 punktów) ggplot użyje uproszczonej
metody GAM.
W przypadku, gdy nie chcemy przedziałów ufności możemy użyć
argumentów, jakie daje nam funkcja geom_smooth(). Możemy
również wybrać prostą wyrysowywaną z wykorzystaniem regresji
liniowej.
#Przetestuj poniższy kod
ggplot(countries, aes(birth.rate, death.rate))+
geom_point()+
geom_smooth(se=FALSE, method='lm')# bez przedziałów ufności2.5.1 Zadanie
Wypróbować w powyższym przykładzie inne argumenty dla funkcji
geom_smooth w szczególności takie jak span i
formula - sprawdzić w pomocy do czego służą.
Można dodać też inne parametry, jak kolor warstwy itp:
library(MASS)
ggplot(countries, aes(birth.rate, death.rate))+
geom_point()+
geom_smooth(se=FALSE, span = 0.2)
# Wygładzanie przy użyciu lokalnego wygładzania loess z bardziej szczegółowym wygładzaniem (span = 0.2).
ggplot(countries, aes(birth.rate, death.rate)) +
geom_point() +
geom_smooth(se = FALSE, method = 'lm', formula = y ~poly(x,2)) #wygładzanie przy użyciu regresji liniowej lm z formułą dla wielomianu drugiego stopnia.2.6 Mapowanie
Wykresy przedstawiają kolekcje obiektów, które są opisane przez atrybuty graficzne. Mapowania określają, które atrybuty wykresów kodują, które zmienne ze zbioru z danymi.
Dwa przykłady mapowania zmiennych. W pierwszym przypadku dodatkowo w
aes (=eng. aestethic) podajemy parametr
color, który zmienną continent odwzoruje za
pomocą koloru na wykresie kropkowym.
Do zilustrowania tego użyjemy ponownie zestawu danych
countries z pakietu Przewodnik.
UWAGA: Dodanie w aes czegoś innego poza
x i y skutkuje automatycznym dodaniem
legendy.
UWAGA: Poprzez aes przekazujemy, które
zmienne z ramki danych countries oraz w jaki sposób mają
być reprezentowane na wykresie. W powyższym przykładzie na osi
x jest to birth.rate, na osi y
jest to death.rate. Zmienna continent
odwzorowywana jest na wykresie za pomocą koloru.
Można dodać inne mapowanie, np. odwzorowujące populację jako wielkość kropek w wykresie punktowym:
W przypadku odwzorowania zmiennej ciągłej za pomocą koloru pojawia się gradient koloru:
#Przetestuj poniższy kod
ggplot(countries,aes(x=birth.rate, y=death.rate, color=birth.rate))+
geom_point(size=3)Możliwa jest też podanie mapowania dla samej warstwy, jak i zadanie
wartości argumentów (tutaj i wyżej size) - poniżej
aes pojawia się jako argument funkcji
geom_point i daje skutek jak wyżej. Istotne
jest, że mapowanie dotyczy tylko aktualnej geometrii, poniżej
przykład:
#Przetestuj poniższy kod
ggplot(countries,aes(x=birth.rate, y=death.rate))+
geom_point(size=3,aes(color=birth.rate))Przedstawimy teraz powyższe dane, używając geometrii
geom_violin(), która tworzy tzw. wykres skrzypcowy.
Wykres skrzypcowy składa się z dwóch symetrycznych części przypominających klepsydrę lub skrzypce (stąd też jego nazwa). Każda z tych części pokazuje, ile danych znajduje się w różnych zakresach wartości – im szersza część wykresu, tym więcej danych przypada na dany przedział wartości, co obrazuje rozkład danych.
Dodatkowo na tym samym wykresie umieścimy punkty
geom_points, które reprezentują rzeczywiste wartości
danych.
Dzięki takiemu wykresowi możemy porównać rozmieszczenie danych
(birth.rate) między różnymi grupami
(continent).
Zauważmy, że nałożyliśmy tutaj dwie geometrię. Sprawdź, że bez
geom_point() powyższy kod da nam tylko wykresy
skrzypcowe.
W przypadku, gdy podamy argument aes(color=continent) do
funkcji geom_point() to tylko kropki będą miały kolor
odpowiadający kontynentowi, natomiast obrys wykresy skrzypcowego
pozostanie nie zmieniony, tj czarny.:
#Przetestuj poniższy kod
ggplot(countries,aes(x=continent, y=birth.rate))+
geom_violin()+
geom_point(aes(color=continent)) # tylko punkty będą pokolorowane zgodnie z odpowiadającymi in kontynentami.2.6.1 Inne przykłady mapowania
Oczywiście rozrzut wartości pomiędzy różnymi wartościami można zauważy za pomocą innych wykresów, jak np:
geom_point(),geom_boxplot(),geom_dotplot(),geom_violin().
Więcej o interpretacji wykresów na kolejnych laboratoriach.
# Przetestuj poniższy kod
szkielet=ggplot(countries,aes(continent, birth.rate,color=continent, fill=continent)) #wszystko w R może być obiektem...
szkielet+geom_point()
szkielet+geom_boxplot()
szkielet+geom_dotplot(binaxis="y",stackdir="centerwhole", dotsize = 0.6)#help geom_dotplot, co to jest binaxis i stackdir? jak można je zmodyfikować?
szkielet+geom_violin(scale="width") # co robi ten dodatkowy argument?2.7 Od statystyki do geometrii
Wykorzystywaliśmy dotychczas fakt (np. przy geom_bar),
że geometria korzysta z domyślnej statystyki zliczającej. Ale też
statystyki mają swoje domyślne geometrie.
Zadanie: jaki efekt/zadanie/działanie ma w poniższym
przykładzie statystyka stat_ellipse?
2.7.1 Zadanie
Zapytać wujka Google co to jest “confidence ellipse”
2.8 Podział okna ze względu na czynnik
Panel typu facet_grid( ~b) podział w kolumnach na
podstawie czynnika b , tutaj kontynentu:
ggplot(countries, aes(x=birth.rate, y=death.rate))+
stat_ellipse()+
geom_point()+
facet_grid(~continent)Panel typu face_grid( a~.) podział w wierszach na
podstawie czynnika a . UWAGA: ta kropka
jest obowiązkowa w tej konfiguracji!
# Przetestuj poniższy kod
ggplot(countries, aes(x=birth.rate, y=death.rate))+
stat_ellipse()+
geom_point()+
facet_grid(continent~.)Inne opcje:
facet_grid(a ~b)panele w kolumnach na podstawie czynnikab, a w wierszach na podstawie czynnikaafacet_wrap(~b)panele na prostokątnej siatce na podstawie czynnikab
Inny przykład:
ggplot(countries, aes(x=birth.rate, y=death.rate))+
geom_point(data=countries[,c(-1,-5)],size=0.5,color="lightblue")+
stat_ellipse(color="red4")+
geom_point(size=2, color="red")+
facet_grid(~continent)2.8.1 Zadanie
Zidentyfikować w powyższym kodzie, które elementy odpowiadają za
odpowiednie składniki powyższego wykresu. W szczególności wyjaśnić
działanie data=countries[,c(-1,-5)] w tym przykładzie.
3 Modyfikowanie wykresu
3.1 Modyfikowanie wykresu
za pomocą scale
Modyfikowanie automatycznych ustawień wykresu może zostać wykonane za
pomocą “skali” (eng. scale). Np. scale_shape_xxxx
służy zmianie kształtu, np:
scale_shape_manual(values=LETTERS) - zmiana
znaczników na litery,
scale_shape_discrite(solid=TRUE) - zmiana tej
wartości na FALSE powoduje zmianę znaczników na
puste.
Aby zobaczyć listę możliwych modyfikacji wystarczy zacząć wpisawanie
w kodzie R lub w konsoli np. scale_shape_ i poczekać na
autouzupełnianie komendy.
Przetestuj je na poniższym przykładzie
rys1=ggplot(countries, aes(x=birth.rate, y=death.rate, shape=continent))+
geom_point()
rys1 #obiekt ggplot jest jak każdy inny w R, można go przypisać do zmiennej rys1

Inne przykładami zmiany skali są np:
scale_X_reverse() - odwraca skalę na osi x,
scale_x_sqrt() - skala pierwiastkowa na osi
x,
scale_x_log10() - skala logarytmiczna na osi
x,
scale_x_continuous(breaks=c(...)) - dodaje linie
pomocnicze w podanych punktach,
`scale_x_continuous(breaks=c(...), limits=c()) -
dodaje linie pomocnicze plus zmiana zakresu na osi.
# Przetestuj poniższy kod
x=c(1:20)
df <- data.frame(x=x, y=10^x)
rys2=ggplot(df, aes(x=x, y=y))+geom_point()
rys2
#rys2+scale_x_reverse()#odwrócenie skali na osi x
#rys2+scale_x_sqrt() # skala pierwiastkowa
rys2+scale_x_log10() # skala logarytmiczna
#rys2+scale_x_continuous(breaks=c(1,2,5,10,50)) # linie pomocnicze
#rys2+scale_x_continuous(breaks=c(10,20,21,22), limits=c(5,25)) # linie pomocnicze plus zmiana zakresu na osi
3.1.1 Zadanie
Na wspólnym rysunku narysuj wykresy funkcji: \(x^2\), \(3\cdot
x^2\), \(x^3\), \(0.1 \cdot x^3\).
Użyj przedziału \([0.01,5]\) dla
argumentów, np. x=seq(0.01,5, length.out=1001)
Nadaj liniom wybrane kolory i stwórz legendę
Zmień skale osi na logarytmiczne dla obu osi
Co się stało z wykresem? W szczególności - jaki wpływ ma potęga
na kształt wykresu oraz współczynnik przy potędze?
Przykładowy wykres

3.2 Modyfikacja układu
współrzędnych i osi
Przykładowymi funkcjami, które modyfikują układ współrzędnych są:
coord_trans() - transformacja osi,
coord_fixed() - proporcjonalne jednostki na obu
osiach względem zadanej skali,
coord_flip() - zamiana osi,
coord_cartesioan() - kartezjański układ
współrzędnych,
coord_polar() - biegunowy układ
współrzędnych,
coord_map() - rzutuje część ziemi która jest
sferyczna na płaszczyznę 2D.
# Przetestuj poniższy kod
rys2+coord_trans(y="log2", x="log2")
rys2+coord_trans( y="log2")
rys2+coord_fixed()# proporcjonalne jednostki na obu osiach
rys2+coord_fixed(ratio=6)# zajrzeć do pomocy
rys2+coord_flip()
3.3 Themes
Możemy zmienić globalne ustawienia dotyczące wyglądu wykresu. Jeden
ze sposobów to wykorzystanie motywów - theme. W pakiecie
jest kilka zdefiniowanych motywów:
theme_bw() - biały - dobry do druku,
theme_dark() - ciemny
Więcej motywów w pakiecie ggthemes takich jak na
przykład:
them_tufte()
them_excel()
them_excel_new()
Najwygodniej jest przetestować je wykorzystując poniższy kod.
library("ggthemes")
rys2+theme_tufte()+ggtitle("theme_tufte")
rys2+theme_excel()
rys2+theme_excel_new()
?ggthemes
Możemy też zmienić wybrane elementy wykresu. Używając funkcji
theme (w nawiasie kolejne opcje):
ggplot()+
geom_point(data=countries, aes(x=birth.rate, y=death.rate, color=continent))+
labs(title="Dodatkowo zmienione tło wykresu")+
theme(
plot.title = element_text(face = "bold", size = (25),color="steelblue"),
panel.background = element_rect(fill = 'floralwhite')
)

3.1 Modyfikowanie wykresu
za pomocą scale
Modyfikowanie automatycznych ustawień wykresu może zostać wykonane za
pomocą “skali” (eng. scale). Np. scale_shape_xxxx
służy zmianie kształtu, np:
scale_shape_manual(values=LETTERS)- zmiana znaczników na litery,scale_shape_discrite(solid=TRUE)- zmiana tej wartości naFALSEpowoduje zmianę znaczników na puste.
Aby zobaczyć listę możliwych modyfikacji wystarczy zacząć wpisawanie
w kodzie R lub w konsoli np. scale_shape_ i poczekać na
autouzupełnianie komendy.
Przetestuj je na poniższym przykładzie
rys1=ggplot(countries, aes(x=birth.rate, y=death.rate, shape=continent))+
geom_point()
rys1 #obiekt ggplot jest jak każdy inny w R, można go przypisać do zmiennej rys1Inne przykładami zmiany skali są np:
scale_X_reverse()- odwraca skalę na osi x,scale_x_sqrt()- skala pierwiastkowa na osi x,scale_x_log10()- skala logarytmiczna na osi x,scale_x_continuous(breaks=c(...))- dodaje linie pomocnicze w podanych punktach,`
scale_x_continuous(breaks=c(...), limits=c())- dodaje linie pomocnicze plus zmiana zakresu na osi.
# Przetestuj poniższy kod
x=c(1:20)
df <- data.frame(x=x, y=10^x)
rys2=ggplot(df, aes(x=x, y=y))+geom_point()
rys2
#rys2+scale_x_reverse()#odwrócenie skali na osi x
#rys2+scale_x_sqrt() # skala pierwiastkowa
rys2+scale_x_log10() # skala logarytmiczna
#rys2+scale_x_continuous(breaks=c(1,2,5,10,50)) # linie pomocnicze
#rys2+scale_x_continuous(breaks=c(10,20,21,22), limits=c(5,25)) # linie pomocnicze plus zmiana zakresu na osi3.1.1 Zadanie
Na wspólnym rysunku narysuj wykresy funkcji: \(x^2\), \(3\cdot x^2\), \(x^3\), \(0.1 \cdot x^3\).
Użyj przedziału \([0.01,5]\) dla argumentów, np.
x=seq(0.01,5, length.out=1001)Nadaj liniom wybrane kolory i stwórz legendę
Zmień skale osi na logarytmiczne dla obu osi
Co się stało z wykresem? W szczególności - jaki wpływ ma potęga na kształt wykresu oraz współczynnik przy potędze?
Przykładowy wykres
3.2 Modyfikacja układu współrzędnych i osi
Przykładowymi funkcjami, które modyfikują układ współrzędnych są:
coord_trans()- transformacja osi,coord_fixed()- proporcjonalne jednostki na obu osiach względem zadanej skali,coord_flip()- zamiana osi,coord_cartesioan()- kartezjański układ współrzędnych,coord_polar()- biegunowy układ współrzędnych,coord_map()- rzutuje część ziemi która jest sferyczna na płaszczyznę 2D.
# Przetestuj poniższy kod
rys2+coord_trans(y="log2", x="log2")
rys2+coord_trans( y="log2")
rys2+coord_fixed()# proporcjonalne jednostki na obu osiach
rys2+coord_fixed(ratio=6)# zajrzeć do pomocy
rys2+coord_flip() 3.3 Themes
Możemy zmienić globalne ustawienia dotyczące wyglądu wykresu. Jeden
ze sposobów to wykorzystanie motywów - theme. W pakiecie
jest kilka zdefiniowanych motywów:
theme_bw()- biały - dobry do druku,theme_dark()- ciemny
Więcej motywów w pakiecie ggthemes takich jak na
przykład:
them_tufte()them_excel()them_excel_new()
Najwygodniej jest przetestować je wykorzystując poniższy kod.
library("ggthemes")
rys2+theme_tufte()+ggtitle("theme_tufte")
rys2+theme_excel()
rys2+theme_excel_new()
?ggthemes Możemy też zmienić wybrane elementy wykresu. Używając funkcji
theme (w nawiasie kolejne opcje):
ggplot()+
geom_point(data=countries, aes(x=birth.rate, y=death.rate, color=continent))+
labs(title="Dodatkowo zmienione tło wykresu")+
theme(
plot.title = element_text(face = "bold", size = (25),color="steelblue"),
panel.background = element_rect(fill = 'floralwhite')
)4 Zadania
4.1 Zadanie 1 - wykres i jego modyfikacje
Ponownie zaczniemy od wykresu podstawowego, tym razem gęstości kilku rozkładów normalnych (o wybranych parametrach) - kopiuj/wklej:
x<-seq(-3.1,5.1, by =.01)
y1=dnorm(x)
y2=dnorm(x,sd=2)
y3=dnorm(x,sd=1/2)
y4=dnorm(x,mean=2)
xx=as.data.frame(cbind(x,y1, y2, y3, y4))
ggplot(xx)+
geom_line(aes(x,y1,color="N(0,1)"),size=2)+
geom_line(aes(x,y2,color="N(0,4)"),size=2)+
geom_line(aes(x,y3,color="N(0,1/4)"),size=2)+
geom_line(aes(x,y4,color="N(2,1)"),size=2)+
scale_color_manual(name="opis",
breaks=c('N(0,1)', 'N(0,4)', 'N(0,1/4)', 'N(2,1)'),
values=c('N(0,1)'='blue', 'N(0,4)'='red', 'N(0,1/4)'='green', 'N(2,1)'='orange'))4.1.1 Zadanie 1a - modyfikacja osi
Za pomocą theme zmodyfikować osie wykresu:
większa czcionka przy etykietach osi
obrócenie etykiet osi “y”
usunięcie nazw osi
tak aby zyskać efekt:
Wskazówka: Warto spojrzeć na przydatny link.
4.1.2 Zadanie 1b - modyfikacja tła
Jak w zadaniu wyżej, zmienić kolor tła, główne linie siatki,
pomocnicze linie siatki, obramowanie poprzez themes tak,
aby uzyskać efekt jak niżej. Nazwy parametrów do zmiany to:
panel.border
panel.background
panel.grid.major
panel.grid.minor
Wskazówka: Przydatny link.
Efekt powinien przypominać:
4.1.3 Zadanie 1c - modyfikacja legendy
Teraz zmieniamy poprzez theme:
rozmiar czcionki tytułu legendy - tutaj tekstu “opis”,
legend.titlerozmiar czcionki elementów legendy,
legend.textwyrównanie tekstu “opis” na środkowe (center),
legend.title.alignpołożenie legendy - ma być wewnątrz wykresu,
legend.positionramka wokół legendy, kolorowa, pogrubiona,
legend.box.backgroundtło legendy pod znacznikami, tutaj jest
floralwhitelepiej aby był jednolity z resztą tła,legend.keytło legendy, tutaj
floralwhite,legend.backgroundWskazówka: Przydatny link
4.2 Zadanie 2
Wstęp: dane i kod kopiuj/wklej
Zaczniemy od importu danych w formacie Excela z Laboratorium 4 (możliwe, że trzeba będzie zmienić katalog):
library(ggplot2)
library(readxl)
Students_performance <- read_excel("Students_performance.xlsx")
head(Students_performance)## # A tibble: 6 × 15
## StudentID Age Gender Ethnicity ParentalEducation StudyTimeWeekly Absences
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1001 17 1 0 2 19.8 7
## 2 1002 18 0 0 1 15.4 0
## 3 1003 15 0 2 3 4.21 26
## 4 1004 17 1 0 3 10.0 14
## 5 1005 17 1 0 2 4.67 17
## 6 1006 18 0 0 1 8.19 0
## # ℹ 8 more variables: Tutoring <dbl>, ParentalSupport <dbl>,
## # Extracurricular <dbl>, Sports <dbl>, Music <dbl>, Volunteering <dbl>,
## # GPA <dbl>, GradeClass <dbl>
W Laboratorium 4 znajdziemy tez opis, co która zmienna oznacza.
Zauważmy, że pewne kolumny “liczbowe” służą do kodowania np. płci (zmienna Gender), w związku z czym możliwe jest policzenie
## [1] 0.5108696
co oczywiście sensu nie ma. Dlatego też wybrane zmienne liczbowe zamienimy na zmienne jakościowe (co później pozwoli na odpowiednie ich wykorzystanie przy wykresach):
Students_performance$Gender=as.factor(Students_performance$Gender)
Students_performance$Ethnicity=as.factor(Students_performance$Ethnicity)
Students_performance$ParentalEducation=as.factor(Students_performance$ParentalEducation)
Students_performance$Tutoring=as.factor(Students_performance$Tutoring)
Students_performance$ParentalSupport=as.factor(Students_performance$ParentalSupport)
Students_performance$Extracurricular=as.factor(Students_performance$Extracurricular)
Students_performance$Sports=as.factor(Students_performance$Sports)
Students_performance$Music=as.factor(Students_performance$Music)
Students_performance$Volunteering=as.factor(Students_performance$Volunteering)Teraz polecenie
## [1] NA
jest niewykonalne (i o to chodziło). Cały czas ma sens polecenie
## 0 1
## 1170 1222
Zadania:
w każdym z poniższych wykresów nadać odpowiedni tytuł wykresu
narysować wykres punktowy zależności
GPA(oś y) odStudyTimeWeekly(oś x)
- narysować wykres punktowy zależności
GPA(oś y) odStudyTimeWeekly(oś x) i za pomocą kolorów zilustrować czynnikParentalSupport, a za pomocną kształtu znacznikashapeczynnik Gender (na jednym rysunku)
- narysować wykres punktowy zależności
GPA(oś y) odStudyTimeWeekly(oś x) i zastosować podział na panele względem czynnikaParentalEducationw wierszach iEthnicityw kolumnach. Dodatkowo, można też wykorzystać parametrlabellerfunkcjifacet_grid(sprawdź w pomocy jak działa ten parametr i przykłady jego zastosowania).
- narysować wykres
boxplotzmiennejStudyTimeWeeklyw wersji pionowej”. Rysunek powinien wyglądać jak niżej.
- na powyższym wykresie skala na osi “x” nie ma sensu - usunąć ją
(zmiana w
theme)
- narysować wykres
boxplotzmiennejGPAz podziałem (kolorami) ze względu naEthnicity
- narysować wykres
boxplotzmiennejGPAz podziałem (kolorami) ze względu naParentalEducation
- narysować wykres
boxplotzmiennejGPAz podziałem (kolorami) ze względu naParentalSupport
czy na podstawie ostatnich trzech wykresów można wysunąć jakieś wnioski
narysować wykres
boxplotzmiennejGPAz podziałem (kolorami) ze względu naGenderoraz na panele ze względu naEthnicity