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/

1.2 Instalowanie i ładowanie

W przeciwieństwie do wcześniej omawianego pakietu graphics, pakiet ggplot2 nie jest automatycznie ładowany czy instalowany

Jeżeli pakiet ggplot2 nie jest zainstalowany, to należy go zainstalować w standardowy sposób.

Pakiet ggplot2 należy (w każdym nowym pliku) załadować, np. poprzez library(ggplot2) (wystarczy 1 raz).

1.3 Pierwszy wykres

Możliwości pakietu ggplot2 są ogromne, pozwalają na dostosowanie każdego elementu wykresu. Standardowo potrzebne jest przekazanie danych do stworzenia wykresu najlepiej za pomocą ramki danych poprzez parametr data (lub jako pierwszy argument bez nazwy) oraz przekazanie funkcji aes określającej jakie dane z data zostaną odwzorowane na wykresie (i w jaki sposób).

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(kol_x=wart_x,kol_sin=wart_y,kol_cos=wart_z) # Tworzymy ramkę danych
ggplot(data=df, aes(x = kol_x, y = kol_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_.

1.4 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 = kol_x, y = kol_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 za rysowanie wykresu

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 = kol_x, y = kol_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.

1.5 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

1.6 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=kol_x,y=kol_sin))+
  geom_line()+
  geom_line(aes(x=kol_x,y=kol_cos))

Sprawdzając pomoc 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=kol_x,y=kol_sin))+
  geom_line(color="red", alpha=0.6, size=1.5)+
  geom_line(aes(x=kol_x,y=kol_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(values="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 = kol_x)) +
  geom_line(aes(y = kol_sin, color = "sinus"), alpha = 0.6, size = 1.5) +
  geom_line(aes(y = kol_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 = kol_x)) +
  geom_line(aes(y = kol_sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
  geom_line(aes(y = kol_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 = kol_x)) +
  geom_line(aes(y = kol_sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
  geom_line(aes(y = kol_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 = kol_x)) +
  geom_line(aes(y = kol_sin, color = "sinus", linetype = "sinus"), alpha = 0.6, size = 1.5) +
  geom_line(aes(y = kol_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"))

1.7 Tytuł wykresu, nazwy osi

Aby zmodyfikować nazwę wykres, osi, legendę można użyć funkcji labs(), np.:

ggplot(df, aes(x=kol_x,y=kol_sin))+
  geom_line(color="red")+
  geom_line(aes(x=kol_x,y=kol_cos), color="blue")+
  labs(title="Wykres funkcji trygonometrycznych", 
       x="Dziedzina", 
       y="Wartości")

1.8 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, możliwe, że w aes działają tylko nazwy)

  • wspólna legenda

  • opis osi, tytuł rysunku

  • wybrać odpowiedni przedział (nie za krótki, by było widać ewentualną okresowość, ale też nie za duży, by wartości np. funkcji kwadratowej nie były zbyt duże. W poniższym przykładzie jest to przedział \([-\pi,\pi]\)).

W efekcie powinniśmy dostać coś podobnego do

2 Wybrane zastoswania geometrii i możliwości ggplot2

2.1 Dane do wykresów

Użyjemy danych z pakietu (wymaga jednorazowego zainstalowania)

library("Przewodnik")

a dokładniej zbiór danych countries. Wyświetlimy opis tego zbioru oraz zapoznamy się z jego strukturą i zawartością (wykonać polecenia):

? countries #opis
head(countries) #struktura ramki, jakie dane się tam znajdują
summary(countries) #podsumowanie

2.2 Wykres punktowy - geom_point() i inne

Zaczniemy od wykresu punktowego

library("ggplot2")
ggplot(countries,aes(birth.rate,death.rate))+ #x= oraz y= można pominąć jako standardowa kolejność argumentów
  geom_point()

Następnie możemy dodać koleją warstwę odpowiadającą za trend

ggplot(countries,aes(birth.rate,death.rate))+
  geom_point()+
  geom_smooth(se=FALSE, size=3)

2.2.1 Zadanie

Sprawdzić w pomocy geom_smooth, za co odpowiada parametr se. Jaki efekt da zamiana go na wartość TRUE? Parametr size chyba jest oczywisty, ale warto przetestować zmianę jego wartości. Jak zmienić kolor krzywej trendu z niebieskiego (standardowy) na własny?

2.3 geom_violin i inne geometrie

2.3.1 Zadanie - wykres w wybranymi geometriami cz. 1

Do podstawowego polecenia (patrz niżej) dodać kolejne elementy wykresu (linijki) zakomentowane pod wykresem. Przy każdym dodaniu nowej linijki dajemy znak + na końcu poprzedniej linijki.

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

Uwaga 2: W tym przykładzie przez funkcję aes podajemy 3 atrybuty/parametry wykresu: zmienne x, y oraz dodatkowo label . Ostatni atrybut jest wykorzystywany przez geom_text do podpisania punktów wykresu.

Uwaga 3: Otrzymany wykres jest dość chaotyczny, ma na celu zilustrowanie działania wybranych geometrii

ggplot(countries,aes(x=continent, y=birth.rate,label=country))+
  geom_violin(aes(fill=continent))

  #geom_boxplot(alpha=0.2)
  #geom_jitter(position=position_jitter(width=0.45))
  #geom_text(check_overlap = TRUE)
  #geom_rug(sides="l")

2.3.2 Zadanie - wykres w wybranymi geometriami cz. 2

W powyższym wykresie:

  1. Wyjaśnić/sprawdzić w pomocy działanie argumentów np. alpha, spróbować zmienić ich wartości.
  2. Usunąć aes(fill=continent), co się zmieniło?
  3. Zmienić label=country na label=population, co się zmieniło?
  4. Zmienić check_overlap na FALSE, co się zmieniło?
  5. Przy okazji, co to jest “wykres skrzypcowy”?

2.4 Przykłady mapowanie zmiennych na atrybuty wykresu

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:

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

UWAGA: Dodanie w aes czegoś innego poza x i y skutkuje dodaniem legendy.

UWAGA: Poprzez aes przekazujemy, które zmienne z ramki danych data 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 populacje jako wielkość kropek w wykresie kropkowym:

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

Nic nie stoi na przeszkodzie, żeby kontynenty zilustrować wielkością kropek (choć to trochę bez sensu, o czym ostrzega warning):

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

Można też użyć kształtu znacznika:

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

W przypadku odwzorowania zmiennej ciągłej za pomocą koloru pojawia się gradient koloru:

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ę w geom_point i daje skutek jak wyżej. Istotne jest że mapowanie dotyczy tylko aktualnej geometrii, poniżej inny przykład będzie:

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

Inny przykład - mapowanie w ggplot zmiennej continent na kolor ustala kolor kropek i obrys wykresu skrzypcowego:

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

ale mapowanie możemy zadać np. tylko dla kropek, obrys pozostaje czarny:

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

2.4.1 Więcej przykładów

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="center")#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.4.2 Atrybuty geometrii

Każda geometria przedstawia dane za pomocą wybranych atrybutów - więcej szczegółów w pomocy, na przykład na temat geom_point

? geom_point

Wymagane są w tym przypadku x i y, pozostałe jak alpha, …. stroke są opcjonalne. Mogą one być mapowane ze zbioru danych - przykłady wyżej.

3 Statystyki i agregacje

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

  1. np. dla wykresu kropkowego 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:
ggplot(countries, aes(continent))+geom_bar()

tutaj mamy tylko jeden atrybut (continent), a zliczanie działa automatycznie.

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

Wykres kropkowy plus trend wraz z wrysowanym odchyleniem standardowym:

ggplot(countries, aes(birth.rate, death.rate))+
  geom_point()+
  geom_smooth()

Wykres kropkowy plus trend bez odchylenia standardowego:

ggplot(countries, aes(birth.rate, death.rate))+
  geom_point()+
  geom_smooth(se=FALSE)

Wykorzystanie regresji liniowej do estymacji trendu:

ggplot(countries, aes(birth.rate, death.rate))+
  geom_point()+
  geom_smooth(se=FALSE, method="lm")

method może mieć wartość lm dla regresji liniowej, rlm dla regresji odpornej (dla rlm konieczne jest dodanie pakietu MASS), loess lokalnie wygładzana wielomianami (domyślna).

3.1 Zadanie

  • Wypróbować wartość rlm

  • inne parametry to span i formula - sprawdzić w pomocy co to jest.

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

ggplot(countries, aes(birth.rate, death.rate))+
  geom_point()+
  geom_smooth(se=FALSE, method="lm", color="red", size=5)

4 Mechanizm warunkowania w ggplot2

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.

4.1 Zadanie

Jaki efekt/zadanie/działanie ma w poniższym przykładzie statystyka stat_ellipse? Zapytać wujka Google co to jest “confidence ellipse”

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

4.2 Warunkowanie - przykłady

Panel typu facet_grid( ~b) to 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 facte_grid( a~.) podział w wierszach na podstawie czynnika a . UWAGA: ta kropka jest obowiązkowa w tej konfiguracji!

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)

4.2.1 Zadanie - kolorowe kropki

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. Skąd biorą się kropki koloru lightblue?

5 Modyfikowanie wykresu

Pakiet ggplot2 umożliwia kontrolę nad wieloma elementami wykresu

5.1 Modyfikowanie wykresu za pomocą scale

Uwaga: ze scale korzystaliśmy też przy tworzeniu legendy do f. trygonometrycznych.

Modyfikowanie automatycznych ustawień wykresu może zostać wykonane za pomocą “skali” (eng. scale). Np. scale_shape_xxxx służy zmianie kształtu znacznika:

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

Pierwsza modyfikacja, zamiana znaczników na litery:

rys1+scale_shape_manual(values=LETTERS)

Inna modyfikacja, puste znaczniki:

rys1+scale_shape_discrete(solid=FALSE)

Aby zobaczyć listę możliwych modyfikacji wystarczy zacząć wpisawanie w kodzie R lub w konsoli np. scale_shape_ i poczekać na autouzupełnianie komendy.

Inne przykłady:

rys2=ggplot(countries, aes(x=birth.rate, y=death.rate))+
  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

5.2 Modyfikacja układu współrzędnych i osi

rys3=ggplot(countries, aes(x=birth.rate, y=death.rate))+
  geom_point()+geom_smooth(se=FALSE,size=2)
rys3

rys3+coord_trans(y="log2", x="log2") # transformacja osi

rys3+coord_fixed()# proporcjonalne jednostki na obu osiach

rys3+coord_fixed(ratio=6)# zajrzeć do pomocy

rys3+coord_flip() # zamiana osi

Funkcje zmieniające układ współrzędnych:

  • coord_cartesian()

  • coord_flip()

  • coord_polar()

  • coord_equal()

  • coord_map()

  • coord_trans()

5.2.1 Zadanie

sprawdzić w pomocy działanie i parametry powyższych transformacji

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

rys3 # standardowy 

rys3+theme_bw() # biały, lepszy do druku

#?theme_bw #skasuj pierwszy płotek w tej linijce
rys3+theme_dark()

Więcej motywów w pakiecie ggthemes

library("ggthemes")
rys3+theme_tufte()+ggtitle("theme_tufte")

rys3+theme_excel()

rys3+theme_excel_new()

#?ggthemes #skasuj pierwszy płotek w tej linijce

Możemy też zmienić wybrane elementy wykresu. Wykres podstawowy:

ggplot()+
  geom_point(data=countries, aes(x=birth.rate, y=death.rate, color=continent))+
  labs(title="Podstawowy wykres")

i kolejne modyfikacje poprzez themes (w nawiasie kolejne opcje) - przetestować działanie:

ggplot()+
  geom_point(data=countries, aes(x=birth.rate, y=death.rate, color=continent))+
  labs(title="Zmienione parametry tytułu")+
  theme(
    plot.title = element_text(face = "bold", size = (25),color="steelblue")
        )

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 = 'lightcyan')
        )

6 Zadania

6.1 Zadanie - modyfikowanie wykresu

UWAGA: w zadaniu chodzi o zmodyfikowanie wybranych elementów wykresu. Nie jest istotne, czy kolor będzie red czy lightcyan, albo czy rozmiar czcionki to 14 czy 16.

Dla uproszczenia (kopiuj/wklej) stworzymy 2 ramki danych i wykres “podstawowy”

x1=seq(0,2*pi,by=0.05)
y1=sin(x1)
y2=2*cos(x1)
x2=seq(0,2*pi, by=pi/2)
y3=sin(x2)

ramka_ciag=data.frame(kol_x=x1, kol_sin = y1, kol_cos=y2)
ramka_dyskr=data.frame(kol_x=x2, kol_y=y3)
#------------ wykres podstawowy
ggplot()+
  geom_line(data=ramka_ciag,aes(x=kol_x,y=kol_sin ,colour="k1"),linewidth=1 )+
  geom_line(data=ramka_ciag,aes(x=kol_x,y=kol_cos, colour="k2"),linewidth=1) +
  geom_point(data=ramka_dyskr,aes(x=kol_x,y=kol_y,colour="dyskretne"),size=5,pch="x")+
  scale_color_manual(name = "Legenda", values = c("k1" = "darkblue","k2" = "red","dyskretne"="darkgreen"))

6.1.1 Zadanie (a) - dodajemy modyfikacje

W efekcie powinniśmy dostać wykres podobny do:

6.1.2 Zadanie (b) - modyfikujemy czcionki

Zmodyfikować wygląd czcionek (kolor, rozmiar, pogrubienie) poprzez themes tak, aby uzyskać efekt jak na rysunku niżej - można oczywiście użyć innych kolorów lub rozmiaru. Przydatne linki:

https://environmentalcomputing.net/graphics/ggplot/ggplot-labels/

6.1.3 Zadanie (c) - modyfikujemy tło

Zmienić kolor tła, główne linie siatki, pomocnicze linie siatki, obramowanie poprzez themes tak, aby uzyskać efekt jak niżej. Kolory można dobrać własne (mój efekt nie jest zbyt estetyczny). Tym razem bez linków 👹, nazwy parametrów do zmiany to:

  • panel.border

  • panel.background

  • panel.grid.major

  • panel.grid.minor

    Wskazówka: wyszukać w google…

6.2 Zadanie 2 - “rozkład normalny”

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)+
  labs(caption="źródło inspiracji - dr K.N.")+
  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'))

6.2.1 Zadanie (a) - 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:

6.2.2 Zadanie (b) - 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. Tym razem bez linków 👹, nazwy parametrów do zmiany to:

  • panel.border

  • panel.background

  • panel.grid.major

  • panel.grid.minor

    Efekt powinien przypominać:

6.2.3 Zadanie (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

6.3 Zadanie - “wiatr”

Wczytamy dane (tym razem ze strony www)

wiatry=read.csv("https://home.agh.edu.pl/~bras/R/wiatr.csv", sep=";")
wiatry$sector=as.factor(wiatry$sector) # zmiana typu danych. Ta zmienna jest wczytywana przez R jako 'char' a przydatniejsze jest interpretowanie jej jako zmienną jakościową
head(wiatry)
##                  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

Jest to zredukowany zbiór danych pomiarowych z poprzednich ćwiczeń, zawiera jedynie wybrane wartości wskazań prędkości wiatru oraz kierunku. Dane zostały rozszerzone o zmienną jakościową sector, wyliczoną na podstawie wskazań kierunku wiatru. W skrócie jest to mocno uproszczona “róża wiatrów” ograniczona do 4 kierunków głównych. spoiler alert - budowa podobnej ramki z sektorem to część projektu.

Podstawowy wykres:

ggplot(data=wiatry, aes(x=anemo_80m, y=anemo_60m,color=sector))+
  geom_point()

6.3.1 Zadanie (a) - panele

Podzielić za pomocą warunkowania powyższy wykres na 4 panele odpowiadające sektorom. Nadać zmiennym swoje ulubione kolory. Powinniśmy dostać coś takiego:

6.3.2 Zadanie (b) - małe modyfikacje

  • za pomocą theme usunąć legendę (lub w inny sposób)

  • zmniejszyć rozmiar kropek

6.3.3 Zadanie (c) - stat_ellipse

Wykorzystać stat_ellipse do narysowania elips na panelach wykorzystując różne wartości jej argumentu level(odesłać 2 przykłady). Kolor można zmienić np. na czarny (żeby było widać elipsy). Np dla level=0.5 dostaniemy: