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:

  1. 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_…

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

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

  4. Aspekt określa sposób dzielenia i wyświetlania podzbiorów danych jako małych wielokrotności.

  5. 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:

https://ggplot2-book.org/

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)) #Przekazanie ramki 

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 elementarni 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:

ggplot()+
  geom_line(data=df, aes(x = time, y = sin)) 

Różnica polega na tym, że dostęp do danych df ma tylko warstwa geom_line.

  • można zbudować wykres bazujący na różnych ramkach w osobnych geometriach.

  • Teoretycznie wszystko można pisać “ciągiem”, jednak zasada “jedno polecenie/geometria - jedna linijka” zwiększa czytelność kodu.

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 krzywa

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:

ggplot(df, aes(x=time,y=sin))+
  geom_line()+
  geom_line(aes(x=time,y=cos))

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. Aby wymusić utworzenie legendy 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.5 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\)).

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

W efekcie powinniśmy dostać coś podobnego do

2.6 Statystyki i agregacje

Każda warstwa ma określony dodatkowy atrybut - statystykę, czyli funkcję agregującą dane:

  1. np. dla wykresu punktowego geom_point statystyka ta to funkcja identycznościowa, czyli “nic nie robi”
  2. 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.

  1. Niektóre statystyki można parametryzować, np. geom_smooth, kilka przykładów:

Do zilustrowania tego użyjemy zestawu danych countries z pakietu Przewodnik.

library("Przewodnik")
head(countries) #zobaczmy co jest w tej ramce danych
##               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
ggplot(countries, aes(birth.rate, death.rate))+
  geom_point()+
  geom_smooth()# z przedziałami ufności

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.6.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żą.

Przykładowy wynik (zależy od wartości argumentów):

Można dodać też inne parametry, jak kolor warstwy itp:

#Przetestuj poniższy kod
ggplot(df, aes(time, sin))+
  geom_point()+
  geom_smooth(se=FALSE, method="lm", color="red", size=5)

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

ggplot(countries,aes(x=birth.rate, y=death.rate, color=continent))+
  geom_point()

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:

ggplot(countries, aes(birth.rate, death.rate, color=continent, size=population))+geom_point()

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

ggplot(countries,aes(x=continent, y=birth.rate,color=continent))+
  geom_violin()+
  geom_point()

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.7.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.8 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?

ggplot(countries, aes(x=birth.rate, y=death.rate))+
  stat_ellipse()+
  geom_point()

2.8.1 Zadanie:

Zapytać wujka Google co to jest “confidence ellipse”

2.9 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:

  1. facet_grid(a ~b) panele w kolumnach na podstawie czynnika b, a w wierszach na podstawie czynnika a
  2. 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[,-5],size=0.5,color="lightblue")+
  stat_ellipse(color="red4")+
  geom_point(size=2, color="red")+
  facet_grid(~continent)

2.9.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[,-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

#rys1+scale_shape_manual(values=LETTERS)
#rys1+scale_shape_discrete(solid=FALSE)

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?

Wykres (ostatni?) powinien przypominać:

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

# Przetestuj poniższy kod 
rys2 # standardowy 
rys2+theme_bw() 
rys2+theme_dark()

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 - wykres i jego modyfikacje

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 - część a - modyfikacja osi

Za pomocą theme zmodyfikować osie wykresu:

  • większa czcionka przy etykietach osi

  • obrócenie etykiet osi “y”

  • usunięcie nazw osi

Wskazówka: Warto spojrzeć na przydatny link.

Efekt powinien przypominać:

4.1.2 Zadanie - cześć b - modyfikacja tła

Zmienić kolor tła, główne linie siatki, pomocnicze linie siatki, obramowanie poprzez themes. 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 - część c - modyfikacja legendy

Teraz zmieniamy poprzez themes:

  • 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 cyan i bardzo daje po oczach. Lepiej dać np. lightblue jednolity z resztą tła, legend.key

  • tło legendy, tutaj lightblue, legend.background

    Wskazówka: Przydatny link

4.2 Zadanie

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

mean(Students_performance$Gender)
## [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

mean(Students_performance$Gender)
## [1] NA

jest niewykonalne (i o to chodziło). Cały czas ma sens polecenie

summary(Students_performance$Gender)
##    0    1 
## 1170 1222

Zadania:

UWAGA w każdym z poniższych wykresów nadać odpowiedni tytuł wykresu. Przy poszczególnych podpunktach podajemy przykładowe wyniki (np. bez wytułów, chodzi głównie o wygląd 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