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 puzli). 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 wszytkim 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/

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

2 Warstwy

Na początku musisz przekazać ramkę danych do funkcji ggplot i określić aes, czyli estetyki, które określają zmienne mapowania.

library(ggplot2)
x=seq(0,10, by=0.1)
y=sin(x)
z=cos(x)
df <- data.frame(time=x,sin=y,cos=z) # Tworzymy ramkę danych
ggplot(df, aes(x = sin, y = cos))

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 = x, y = y)) + geom_line()

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

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 ?goem_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 ase() dodamy więcej ustawień estetyki to utworzy nam się więcej legend. Zauważmy, że najładniej 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, jednak w legendzie nie niebieska linia nie jest przerywana. Czyli nie dziedziczymy typu linii. Dlatego też raczej unikajmy tego sposobu.

Tworzenie legendy z powyższych przykładów wydaje się zadaniem bardzo nieprzyjemnym i uciążliwym w szczególności, gdy będziemy chcieli uzyskać więcej krzywych o różnym stylu, a nie tylko dwie. Dlatego też, przedstawimy alternatywny sposób tworzenia legendy, który według nas jest wygodniejszy i łatwiejszy w zrozumieniu. Wymaga jednak modyfikacji ramki danych za pomocą funkcji melt(), która jest dostępna w bibliotece reshcape2.

Funkcja melt() przekształca dane do dłuższego formatu, pozostawiając kolumny określone w parametrze id jako identyfikatory (w naszym przypadku będzie to time),a wszystkie pozostałe kolumny są przekształcane w dwie kolumny: variable i value. Kolumna variable będzie zawierała nazwy oryginalnych zmiennych (sin i cos), a kolumna value będzie zawierała odpowiadające im wartości.

Wtedy przyjemniej tworzy nam się legenda, dla której możemy ustali color i typ linii w następujący sposób.

library(reshape2)
df_melted <- melt(df, id=c("time"))
ggplot(df_melted, aes(x=time, y=value, color=variable, linetype=variable))+
  geom_line()+
  scale_color_manual(values=c("sin" = "red", "cos" = "blue"))

2.4 Tworzenie adnotacji

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

ggplot(df, aes(x=time,y=cos))+
  geom_line(color="red")+
  geom_line(aes(x=time,y=cos), color="blue")+
  labs(title="Wykres funkcji trygonometrycznyc", 
       x="Dziedzina", 
       y="Wartości")

2.5 Statystyki i agregacje

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

  1. np. dla wykresu punktowego 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:
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:

Wykres punktowy plus trend wraz z przedziałami ufności:

ggplot(df, aes(time, sin))+
  geom_point()+
  geom_smooth()# z przedziałami ufności
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

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ć prosta była wyrysowywana z wykorzystaniem regresji liniowej.

#Przetestuj poniższy kod
ggplot(df, aes(time, sin))+
  geom_point()+
  geom_smooth(se=FALSE, method='lm')# bez przedziałów ufności

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

Zadanie:

Wypróbować w powyższym przykładzie metodę rlm oraz inne argumenty dla funkcji geom_smooth takie jak span i formula - sprawdzić w pomocy do czego służą.

###ODPOWIEDŹ

library(MASS)
ggplot(df, aes(time, sin))+
  geom_point()+
  geom_smooth(se=FALSE, method = 'loess', span = 0.2)
# Wygładzanie przy użyciu lokalnego wygładzania loess z bardziej szczegółowym wygładzaniem (span = 0.2).

ggplot(df, aes(time, sin)) +
  geom_point() +
  geom_smooth(se = FALSE, method = MASS::rlm) #Wygładzanie przy użyciu odpornej metody regresji rlm z pakietu MASS.

ggplot(df, aes(time, sin)) +
  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.

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.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 zestawu danych countries z pakietu Przewodnik.

library("Przewodnik")
## Loading required package: PogromcyDanych
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: SmarterPoland
## Loading required package: httr
## Loading required package: htmltools
## Loading required package: PBImisc
data <- countries
ggplot(data,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 color odwzorowywana jest na wykresie za pomocą koloru.

Można dodać inne mapowanie, np. odwzorowujące populację jako wielkość kropek w wykresie punktowym:

ggplot(data, 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 w inny sposób. Użyjemy innej geometrii geom_violin która tworzy wykres skrzypcowy. Są one wygodne do wizualizacji danych ze względu na różne kategorie. Są podobne do boxplotów.

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

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

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

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:

  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)

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

#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.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 1 - profil pionowy i 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”

#---------------utworzenie dwóch funkcji--------------------
#---------------powinny być znane z poprzedniego laboratorium
#---------------można przekopiować, żeby móc działać
v_hell=function(h)
{4.786089*(h/40.9)^0.267734
}
v_log = function(h)
{4.786089*log(h/1.356629)/log(40.9/1.356629)
}

#------------dane do wykresów
wysokosci_pomiar=c(40.9,60.9,80.9)
predkosci_pomiar=c(4.786089,5.296304,5.739292)

h=c(10:130)
ramka_wzorki=data.frame(wysokosci=h,Vhell=v_hell(h),Vlog=v_log(h))
ramka_pomiar=data.frame(wysokosci=wysokosci_pomiar,predkosci=predkosci_pomiar)
#------------ wykres podstawowy
ggplot()+
  geom_line(data=ramka_wzorki,aes(x=wysokosci,y=Vhell ,colour="Vhell"),linewidth=1 )+
  geom_line(data=ramka_wzorki,aes(x=wysokosci,y=Vlog,colour="Vlog"),linewidth=1) +
  geom_point(data=ramka_pomiar,aes(x=wysokosci,y=predkosci,colour="dane z pomiaru"),size=5,pch="x")+
  scale_color_manual(name = "Legenda", values = c("Vhell" = "darkblue","Vlog" = "red","dane z pomiaru"="darkgreen"))

4.1.1 Zadanie 1a - dodajemy modyfikacje

W efekcie powinniśmy dostać wykres podobny do:

4.1.2 Zadanie 1b - 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/

4.1.3 Zadanie 1c - 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…

4.2 Zadanie 2 - 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.2.1 Zadanie 2a - 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:

4.2.2 Zadanie 2b - 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ć:

4.2.3 Zadanie 2c - 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

## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `legend.title.align` argument of `theme()` is deprecated as of ggplot2
## 3.5.0.
## ℹ Please use theme(legend.title = element_text(hjust)) instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: A numeric `legend.position` argument in `theme()` was deprecated in ggplot2
## 3.5.0.
## ℹ Please use the `legend.position.inside` argument of `theme()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

## Zadanie 3

Wczytamy dane, podział na 4 sektory kierunków jak na poprzednich zajęciach (kopiuj/wklej):

library(readxl)
#dane_w2 <- read_excel("C:/costam/costam/dane_w2.xlsx", 
#                      col_types = c("date", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric", "numeric", "numeric", 
#                       "numeric"))
sektor=NULL
sektor[which(dane_w2$CH7Avg<=45 | dane_w2$CH7Avg>315)]="N"
sektor[which(dane_w2$CH7Avg>45 & dane_w2$CH7Avg<=135)]="E"
sektor[which(dane_w2$CH7Avg>135 & dane_w2$CH7Avg<=225)]="S"
sektor[which(dane_w2$CH7Avg>225 & dane_w2$CH7Avg<=315)]="W"
wiatry=data.frame(date=dane_w2$`Date & Time Stamp`,anemo_80m=dane_w2$CH4Avg,anemo_60m=dane_w2$CH5Avg,anemo_40m=dane_w2$CH6Avg,kierunek_80m=dane_w2$CH7Avg,sector=sektor)
#head(wiatry)

Podstawowy wykres:

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

4.2.4 Zadanie 3a - panele

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

Przy okazji zmieniliśmy kolory z automatycznych na wybrane, tutaj za pomocą scale_color_manual(values=c("#125333", "#E69F00", "#56B4E9","#877214")).

Ciekawostka: powyżej kolory podane są w kodzie HEX . Przykładowa strona, gdzie można wybrać kolor i otrzymać jego numer to:

https://redketchup.io/color-picker

4.2.5 Zadanie 3b - małe modyfikacje

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

  • zmniejszyć rozmiar kropek

4.2.6 Zadanie 3c - stat_ellipse

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