1 Formatowanie tabel w pakiecie gt

Zaczniemy od załadowania pakietu gt oraz dplyr. Możliwe, że pakiet gt trzeba zainstalować jednorazowo w znany sposób.

#install.packages("gt")
library(dplyr)
library(gt)

Podstawy dotyczące formatowania tabel w pakiecie gt znajdziemy na stronie:

podstawy gt.

W powyższym tutorialu autorzy korzystają z operatora |> mającego takie same działanie jak znany z dplyr operator %>%.

1.1 Zadanie - podstawy gt()

Do zadania wykorzystamy pierwsze 10 wierszy wbudowanej w R ramki danych iris, tj.

gt_iris=head(iris,10)
gt(gt_iris) # podstawowa ramka
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa
4.6 3.4 1.4 0.3 setosa
5.0 3.4 1.5 0.2 setosa
4.4 2.9 1.4 0.2 setosa
4.9 3.1 1.5 0.1 setosa

Następnie, wykorzystując tutorial, należy (nie koniecznie po kolei):

  • zmienić tytuł i podtytuł tabeli na własny,

  • dodać źródło,

  • dodać odnośnik do wybranego elementu tabeli,

  • pogrupować kolumny działki kielicha i płatka,

  • przenieść kolumnę z gatunkiem na początek,

  • nadać kolumną własne, polskie nazwy.

Efekt końcowy powinien przypominać tabelkę wyglądającą jak niżej:

Przykładowy efekt
Ramka iris
dane wbudowane w R
Gatunek
Działka kielicha
Płatek
Długość Szerokość Długość Szerokość
setosa 5.1 3.5 1.4 0.2
setosa 4.9 3.0 1.4 0.2
setosa 4.7 1 3.2 1.3 0.2
setosa 4.6 3.1 1.5 0.2
setosa 5.0 3.6 1.4 0.2
setosa 5.4 3.9 1.7 0.4
setosa 4.6 3.4 1.4 0.3
setosa 5.0 3.4 1.5 0.2
setosa 4.4 2.9 1.4 0.2
setosa 4.9 3.1 1.5 0.1
Źródło: R
1 Mój ulubiony wiersz

1.2 Zadanie - format liczb i kolory

Zaczniemy od pobrania pliku RK4.csv ze strony przedmiotu oraz wczytaniu danych. Plik ten zawiera wyniki eksperymentów numerycznych - metody Rungego - Kutty rzędu 4 zastosowanej do wybranego równania różniczkowego zwyczajnego. Jest to pewne rozwinięcie schematu Eulera omawianego w Laboratorium 1. Kolejne kolumny oznaczają: no. - kolejny numer, N - liczba kroków, h - długość kroku, error - błąd mierzony jako różnica między wynikiem z metody a rozwiązaniem dokładnym, q - iloraz błędów, p \(=\log_2 (q)\) numeryczny rząd zbieżności metody (dobrze żeby był w przybliżeniu równy 4).

Zadanie:

  • wczytać dane

  • nadać odpowiedni format liczbowy kolumnom: no. i N - liczby całkowite - czyli pewnie zostawić, jak jest, h i error - format naukowy z 2 cyframi po przecinku, q i p - liczbowy z 2 cyframi po przecinku.

  • NA - zastąpić znakiem -- (dwa minusy)

  • wyrównanie do prawej kolumn (o ile byłoby inne)

  • nadać wybrane kolory tabeli (inwencja własna)

  • można dodać tytuł i podtytuł tabeli, jak w przykładzie niżej

Przydatne strony (sugeruje przejście od razu do przykładów)

Przykładowy efekt
Schemat Rungego-Kutty
bez formatowania
no. N h error q p
1 10 2.000000e-01 6.063362e-05 NA NA
2 20 1.000000e-01 7.653130e-06 7.9227218 2.9859961
3 40 5.000000e-02 6.691689e-07 11.4367682 3.5156075
4 80 2.500000e-02 5.115456e-08 13.0813146 3.7094356
5 160 1.250000e-02 3.564025e-09 14.3530311 3.8432835
6 320 6.250000e-03 2.355794e-10 15.1287639 3.9192222
7 640 3.125000e-03 1.514799e-11 15.5518539 3.9590147
8 1280 1.562500e-03 9.616752e-13 15.7516740 3.9774333
9 2560 7.812500e-04 6.183942e-14 15.5511670 3.9589509
10 5120 3.906250e-04 8.049117e-15 7.6827586 2.9416244
11 10240 1.953125e-04 4.385381e-15 1.8354430 0.8761283
12 20480 9.765625e-05 1.598721e-14 0.2743056 -1.8661443
13 40960 4.882813e-05 9.547918e-15 1.6744186 0.7436602
14 81920 2.441406e-05 9.825474e-15 0.9717514 -0.0413408
15 163840 1.220703e-05 4.796163e-14 0.2048611 -2.2872820
Schemat Rungego-Kutty
efekt końcowy
no. N h error q p
1 10 2.00 × 10−1 6.06 × 10−5
2 20 1.00 × 10−1 7.65 × 10−6 7.92 2.99
3 40 5.00 × 10−2 6.69 × 10−7 11.44 3.52
4 80 2.50 × 10−2 5.12 × 10−8 13.08 3.71
5 160 1.25 × 10−2 3.56 × 10−9 14.35 3.84
6 320 6.25 × 10−3 2.36 × 10−10 15.13 3.92
7 640 3.13 × 10−3 1.51 × 10−11 15.55 3.96
8 1280 1.56 × 10−3 9.62 × 10−13 15.75 3.98
9 2560 7.81 × 10−4 6.18 × 10−14 15.55 3.96
10 5120 3.91 × 10−4 8.05 × 10−15 7.68 2.94
11 10240 1.95 × 10−4 4.39 × 10−15 1.84 0.88
12 20480 9.77 × 10−5 1.60 × 10−14 0.27 −1.87
13 40960 4.88 × 10−5 9.55 × 10−15 1.67 0.74
14 81920 2.44 × 10−5 9.83 × 10−15 0.97 −0.04
15 163840 1.22 × 10−5 4.80 × 10−14 0.20 −2.29

1.3 Więcej gt

Więcej przykładów zastosowania pakietu gt i formatowania tabel można zaleźć w np.:

https://posit.co/blog/rstudio-community-table-gallery/

https://forum.posit.co/c/irl/table-gallery/64

2 Biblioteka plotly

2.1 Opis biblioteki plotly

Biblioteka plotly umożliwia tworzenie interaktywnych wykresów. Dostępna jest w językach/środowiskach programowania:

  • JavaScript - podstawowa, na niej oparte są pozostałe wersje

  • Python - najbardziej rozwinięta

  • R/RStudio

  • Julia

  • Matlab

  • F#

Wymaga jednorazowego zainstalowania w standardowy sposób. Wymaga też każdorazowego ładowania biblioteki library(plotly) (wystarczy 1 raz w skrypcie/R Markdown), często używana jest w połączeniu z pakietem dplyr.

Porównanie kodów w różnych językach

Poniższe przykłady mają za zadanie porównanie składni w wymienionych wyżej językach. Każdy z kodów ma za zadanie narysować te same trzy punkty jako wykres punktowy.

  • JavaScript
#wygenerowany przez ChatGPT
<div id="plot"></div>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<script>
  var trace = {
    x: [0, 2, 4],
    y: [0, 1, -3],
    mode: 'markers',
    type: 'scatter'
  };

  Plotly.newPlot('plot', [trace]);
</script>
  • Python
#wygenerowany przez ChatGPT
import plotly.express as px

x = [0, 2, 4]
y = [0, 1, -3]

fig = px.scatter(x=x, y=y)
fig.show()
  • R
library(plotly)

x = c(0, 2, 4)
y = c(0, 1, -3)

plot_ly(x = ~x, y = ~y, type = "scatter")
  • Julia
#wygenerowany przez ChatGPT
using PlotlyJS

x = [0, 2, 4]
y = [0, 1, -3]

scatter(x = x, y = y, mode = "markers")

2.2 Poruszanie się po wykresie

Zaczniemy od wykonania przykładowego rysunku (kopiuj/wklej poniższy kod). Przy rysowaniu drugiej funkcji korzystamy z operatora %>% z pakietu dplyr.

Wybrane elementy, na które warto zwrócić uwagę (wypróbować)

  • wykres z zamierzenia jest łamaną, najechanie na wykresie na dany węzeł pokazuje dokładne wartości w danym punkcie

  • kliknięcie na nazwę w legendzie pozwala na włączenie/wyłączenie serii danych na wykresie

  • po najechaniu kursorem na wykres pojawia się panel z opcjami

  • można powiększyć wybrany fragment wykresu, w tym “rysując” prostokąt na fragmencie wykresu do powiększenia

  • szybko zresetować wykres możemy poprzez podwójne kliknięcie na wykresie

  • wybranie “Pan” - ikonka ze strzałkami w pojawiającym się panelu pozwala na przesuwanie wykresu

  • wypróbować “Compare data on hover” - taka podwójna strzałka

library(plotly)
library(dplyr)

x = seq(-pi, 2*pi, length.out = 30)


wart_sin = sin(x)
wart_cos = cos(x)

# wykres
plot_ly(x=~x, y=~wart_sin, type="scatter", mode="lines", name="sinus") %>%
  add_lines(x = ~x, y = wart_cos, name = "cosinus") 

2.2.1 Zadanie - pierwszy wykres plotly

Zmodyfikować powyższy wykres w następujący sposób:

  • zwiększyć liczbę punktów podziału siatki do 100. Czy w powiększeniu dalej widać łamaną?

  • dodać do powyższego wykresu dwie wybrane funkcje (np. \(\sin(2x)\), \(\mathrm{arctg}(x)\), ale można też inne).

  • zadbać o odpowiednie opisy na legendzie

Uwaga: tutaj korzystamy z przykładu i ogólnego doświadczenia z R, szczegóły omówimy w dalszej części laboratorium.

Przykładowy wykres - trochę dodatkowych zmian

2.3 plotly i ggplot czyli niczego nowego nie musisz się uczyć. Ale czy aby na pewno?

Polecenie ggplotly(rysunek_ggplot2) pozwala zamienić rysunek wykonany w ggplot2 na jego interaktywną wersję pakietu plotly. W efekcie można tworzyć interaktywne wykresy opierając się na samym ggplot2, który powinien być wszystkim dobrze znany.

Przykład - utworzymy wykres punktowy ggplot2:

library(ggplot2)
rys_gg=ggplot(iris)+
  geom_point(aes(x=Sepal.Length, y=Sepal.Width, color=Species))
rys_gg

i przekształcimy na interaktywny wykres plotly:

ggplotly(rys_gg)

2.3.1 Zadanie - ggplotly na własnym rysunku

Spróbować przerobić własny wykres ggplot2 na rysunek plotly poprzez funkcję ggplotly. Można wykorzystać np. paproć Barnsleya, inny rysunek z przeszłości lub stworzyć nowy (nie musi być szczególnie skomplikowany).

2.3.2 Zadanie - boxplot ggplota do plotly’a

Powyższe rozwiązanie wydaje się idealne, ale nie zawsze działa. Spróbować utworzyć wykres ggplot typu boxplot dla Sepal.Length (ramka iris wbudowana), a następnie przekształcić ją przez ggplotly.

2.3.3 Utrata formatowania przy konwersji ggplo2 na plotly

Rozważmy przykładowy rysunek, jaki był do wykonania w jednym z ćwiczeń na 1 stopniu. Zadanie polegało na dodaniu wybranych szczegółów do rysunku, w tym odpowiedniego sformatowania klucza legendy. Wykres powinien wyglądać jak na rysunku niżej

Niestety, po transformacji do plotly niektóre szczegóły ulegają zatarciu, np. pozycjonowanie legendy czy pomocnicze linie siatki:

Wniosek: jakieś elementy plotly wypada znać.

3 plotly - wprowadzenie

3.1 Podstawowy wykres liniowy i punktowy

Zaczniemy od przygotowania danych do wykresów - można je umieścić w ramce danych, ale nie jest to niezbędne.

Chcemy narysować wykres punktowy/liniowy wybranych danych. Zaczynamy od plot_ly, gdzie podajemy naszą ramkę jako parametr data=df (samo data jest pierwszym argumentem, można czasem pominąć nazwę). Tutaj możemy też zdefiniować pierwsza linię, jaka pojawi się na wykresie. Podajemy typ wykresu type="scatter oraz mode="markers+lines" aby narysować wykres liniowy z zaznaczonymi punktami.

Następnie (poprzez operator %>% z pakietu dplyr lub |> ze standardowego R) dodajemy wykres punktowy \(\cos (x)\) za pomocą add_markers. Wykres liniowy \(\cos (2x)\) możemy dodać albo poprzez add_lines albo poprzez ogólne add_trace z podaniem typu wykresu. Mamy tutaj sporą dowolność i elastyczność w doborze elementów wykresu.

#Przygotowanie danych 
x = seq(-pi, 4*pi, length.out = 50)
y1 = sin(x)
y2 = cos(x)
y3 = cos(2*x)
y4 = atan(x)
df=data.frame(x=x, wart_sin=y1, wart_cos=y2, wart_cos2x = y3, wart_arctg=y4)

plot_ly(data=df, x=~x,
        y=~wart_sin,
        type="scatter",
        mode="markers+lines") %>% 
  add_markers(x=~x,
              y=~wart_cos,) %>% 
  add_trace(x=~x,
            y=~wart_cos2x,
            type="scatter",
            mode="lines")

3.2 Nazwy, kolory - dodawanie kolejnych elementów

Dodamy teraz nazwy, własne kolory oraz inne elementy do poszczególnych serii danych. Ze względu na dziedziczenie przez wszystkie trace parametrów podanych w plot_ly, wykres \(\sin (x)\) narysujemy osobno, poza głównym poleceniem plot_ly.

Serie danych możemy dodawać poprzez ogólne polecenie add_trace() i wewnątrz niego określić typ wykresu lub poprzez wyspecjalizowane polecenia, np. add_markers do dodania wykresu punktowego.

#dane jak wcześniej

plot_ly(data=df) %>% 
add_trace(x=~x,
        y=~wart_sin,
        type="scatter", #typ wykresu
        mode="markers+lines", #punkty zaznaczone "markerami" i połączone liniami
        name="sin(x)",
        line=list(color="red"),
        marker=list(color="blue", size=10, line=list(color="purple", width=3))) %>% 
  add_markers(x=~x, #sam wykres punktowy
              y=~wart_cos,
              name="cos(x)",
              opacity=0.5,
              marker=list(color="darkorange", symbol="triangle-up", size=15,line=list(color="black", width=2))
              ) %>% 
  add_trace(x=~x,
            y=~wart_cos2x,
            type="scatter", #typ wykresu
            mode="lines", #tym razem tylko linie
            name="cos(2x)",
            line=list(color="cornflowerblue", width=6, dash="dash"))

3.3 Pozostałe elementy wykresu

Poprzez dodanie layout() do wykresu możemy zmodyfikować jego elementy, typu kolory, nagłówki, ich wygląd, ogólne zachowanie (np. skumulowany wykres słupkowy).

Narysujemy prosty wykres ramka-wąsy box i dodamy do niego oraz zmodyfikujemy wygląd elementów tekstowych

plot_ly(data=iris) %>% 
  add_trace(x=~Sepal.Length, type="box", color=~Species) %>% 
  layout(
    title=list(text="Tytuł wykresu",
               font=list(
                  family = "Courier New",
                  size = 40,
                  color = "green")
               ), #tytuł wykresu
    legend=list(bgcolor="red", #tło legendy
                title=list(
                  text="Jestem legendą",
                  font=list(size=15)
                  )
                ), #legenda
    yaxis = list(showticklabels = FALSE, #etykiety te same co w legendzie są zbędne
                 title=list(text='Gatunek',
                            font=list(size=18, family='Courier', color='crimson')
                            )
                 ), #dostosowanie osi Y
    xaxis = list(
      title=list(text='Długość płatka',
                 font=list(size=18,
                           family='Comic Sans MS',
                           color='crimson')
                 )
                ), # oś X
  margin = list(t = 100) # bo tytuł się nie mieścił, zwiększamy margines
  )

A teraz skupimy się na kolorach, ten sam wykres, ale modyfikujemy inne elementy:

plot_ly(data=iris) %>% 
  add_trace(x=~Sepal.Length, type="box", color=~Species) %>% 
  layout(
    paper_bgcolor="#ffff32", #kolor tła "papieru", czyli całego obszaru
    plot_bgcolor="lightblue", #kolor tła wykresu
    legend=list(bgcolor="red"), #kolor tła legendy
    yaxis = list(
           gridcolor = '#19955a'), #kolor linii siatki poziomych
    xaxis = list(
           gridcolor = '#000000')  #kolor linii siatki pionowych
  )

3.4 Więcej opcji, więcej przykładów

Opcji formatowania wykresu jest całkiem dużo, podobnie jak w ggplot2, nie będziemy ich tutaj szczegółowo omawiać.

Po dalsze przykłady odsyłam do dobrze przygotowanej dokumentacji i galerii.

4 plotly - zadania

4.1 Zadanie - pobranie danych energii

Zaczniemy od pobrania i wczytania pliku danych tabela_energia_2020_2025.xlsx ze strony przedmiotu. Plik zawiera zestawienie miesięczne produkcji energii elektrycznej w Polsce z podziałem na źródła energii. Dane podane są w [GWh]. Źródło danych: Agencja Rynku Energii.

Zapoznać się ze strukturą danych w pliku (polecenia summary oraz str). Prawdopodobnie kolumna “Miesiac” zostanie wczytana jako char, aby przetransformować ją na zmienną typu Date można użyć następującego polecenia

energia$Miesiac=as.Date(paste(energia$Miesiac, "/01", sep="")) #moja nazwa ramki to energia

Pozostałe dane powinny być wczytane jako zmienne liczbowe (sprawdzić, czy tak jest rzeczywiście).

4.2 Zadanie - wykres ramka-wąsy (box)

Narysować wspólny wykres ramka-wąsy dla wszystkich źródeł energii. Podpisać osie, nadać wykresowi stosowny tytuł.

Przykładowy wykres - nie musi być idealnym odwzorowaniem

4.3 Zadanie - wykres liniowy (scatter, lines)

Narysować wykres liniowy zmian produkcji energii w czasie dla każdego źródła energii. Zadbać o dodatkowe elementy (podpisy itp.). Legendę umieścić pod wykresem. W przypadku osi X ustawić format daty na “miesiąc-rok”.

Przykładowy wykres - nie musi być idealnym odwzorowaniem

4.4 Zadanie - wykres słupkowy skumulowany (bar, barmode="stack")

Narysować wykres słupkowy skumulowany miesięcznych danych produkcji energii. Dodać szczegóły jak wcześniej.

Przykładowy wykres - nie musi być idealnym odwzorowaniem