class: center, middle, inverse, title-slide .title[ # Podstawy programowania ] .subtitle[ ## Wizualizacja danych ] .author[ ### © Łukasz Wawrowski ] --- # Źródła wiedzy - [Przewodnik po wizualizacji danych](https://www.data-to-viz.com/) - [Fundamentals of Data Visualization](https://clauswilke.com/dataviz/) - [Wykresy od kuchni](https://betaandbit.github.io/Wykresy/) - [Color Brewer](http://colorbrewer2.org) - [Nazwy kolorów do użycia w R](http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf) --- class: inverse # Wczytanie danych 1. Ściągnij zbiór [rossmann.xlsx](http://wawrowski.edu.pl/data/rossmann.xlsx) i umieść w folderze `data` 2. Utwórz nowy skrypt i wczytaj biblioteki `tidyverse` i `readxl` 3. Wczytaj zbiór danych `rossmann.xlsx` do pamięci R 4. Za pomocą funkcji `filter` wybierz jeden ze sklepów
−
+
10
:
00
--- # Proste wykresy - `plot()` - wykres punktowy/liniowy - `hist()` - histogram - `barplot()` - wykres kolumnowy - `boxplot()` - wykres pudełkowy --- # Problemy z nazwami zmiennych - nazwy zmiennych nie powinny zawierać polskich liter i spacji - nazwy zmiennych nie powinny zaczynać się od liczby - surowe dane zwykle nie posiadają nazw kolumn przystosowanych do przetwarzania przez komputer - ten problem rozwiązuje pakiet _janitor_ i funkcja `clean_names()`: ``` zbior <- janitor::clean_names(zbior) ``` - funkcja ta zamienia wielkie litery na małe, spacje na podkreślniki i znaki transliteruje do ASCII. --- # Wczytanie danych ```r library(tidyverse) library(readxl) rossmann <- read_xlsx("../data/rossmann.xlsx") sklep11 <- rossmann %>% filter(sklep_id == 11, czy_otwarty == "Tak") plot(sklep11$sprzedaz, sklep11$liczba_klientow) ``` ![](04_wizualizacja_files/figure-html/unnamed-chunk-2-1.png)<!-- --> --- # Pakiet `ggplot2` Tworzenie wykresów poprzez dodawanie (`+`) kolejnych warstw. - [dokumentacja](https://ggplot2.tidyverse.org/) - [podręcznik](https://ggplot2-book.org/) - [cheatsheet](https://rstudio.github.io/cheatsheets/data-visualization.pdf) - [rozszerzenia](https://exts.ggplot2.tidyverse.org/gallery/) ??? Pierwsza wersja 10.06.2007 --- # Niezbędny kod ```r ggplot(data = zbior_danych, aes(x = cecha1, y=cecha2)) ``` - x - zawartość osi x - y - zawartość osi y - fill - wypełnienie - size - rozmiar - color - kolor - shape - kształt --- # Wykres punktowy - `geom_point` Obowiązkowe argumenty `aes`: - x - y --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-5-1.png)<!-- --> ] --- # Dodatkowe elementy - `xlim(0,10)` - minimum i maksimum osi x - `ylim(-5,5)` - minimum i maksimum osi y - `xlab("tekst")` - etykieta osi x - `ylab("tekst")` - etykieta osi y - `ggtitle("tekst")` - tytuł wykresu - `labs(subtitle = "tekst")` - podtytuł - `labs(caption = "tekst")` - podpis - `coord_flip()` - obraca wykres --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + xlab("Liczba klientów") + ylab("Sprzedaż") ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-7-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + xlab("Liczba klientów") + ylab("Sprzedaż") + ylim(0,20000) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-9-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + xlab("Liczba klientów") + ylab("Sprzedaż") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-11-1.png)<!-- --> ] --- # Motywy - theme_bw - theme_classic - theme_dark - theme_gray - domyślnie - theme_light - theme_linedraw - theme_minimal - theme_void Powyższe motywy są zaimplementowane w pakiecie ggplot2, ale można także skorzystać z dodatkowych pakietów: [ggthemes](https://yutannihilation.github.io/allYourFigureAreBelongToUs/ggthemes/), [bbplot](https://github.com/bbc/bbplot), [xkcd](https://cran.r-project.org/web/packages/xkcd/). Istnieje także możliwość stworzenia [własnego motywu](https://www.statworx.com/de/blog/custom-themes-in-ggplot2/). --- class: inverse # Zadanie Przetestuj kilka motywów i wybierz jeden z nich.
−
+
02
:
00
--- # Zapisywanie wykresu - w zakładce Plots -> Export - funkcja `ggsave()` - `filename` - nazwa pliku z rozszerzeniem (png, pdf) - `width` i `height` - szerokość i wysokość (domyślnie w calach) - `scale` - skalowanie po zmianie rozdzielczości - `dpi` - liczba punktów na cal W przypadku generowania plików pdf z polskimi znakami trzeb dodać argument `device = cairo_pdf`. Funkcja `ggsave()` zapisuje ostatnio stworzony wykres. [Wątek](https://github.com/tidyverse/ggplot2/issues/4513) na temat zachowania tej funkcji. --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + xlab("Liczba klientów") + ylab("Sprzedaż") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() ggsave("figs/sklep11.png", width = 12, height = 10, scale = 0.5, dpi = 1200) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-13-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz, color=czy_promocja)) + geom_point() + xlab("Liczba klientów") + ylab("Sprzedaż") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-15-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz, color=czy_promocja)) + geom_point() + xlab("Liczba klientów") + ylab("Sprzedaż") + scale_color_discrete(name = "Promocja?") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-17-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz, color=czy_promocja)) + geom_point() + geom_smooth(method = "lm", se = F) + xlab("Liczba klientów") + ylab("Sprzedaż") + scale_color_discrete(name = "Promocja?") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() ``` ] .pull-right[ ``` ## `geom_smooth()` using formula = 'y ~ x' ``` ![](04_wizualizacja_files/figure-html/unnamed-chunk-19-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz, color=czy_promocja)) + geom_point() + geom_smooth(method = "lm", se = F) + xlab("Liczba klientów") + ylab("Sprzedaż") + scale_color_discrete(name = "Promocja?") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() + theme(legend.position = "bottom") ``` ] .pull-right[ ``` ## `geom_smooth()` using formula = 'y ~ x' ``` ![](04_wizualizacja_files/figure-html/unnamed-chunk-21-1.png)<!-- --> ] --- # Wykres punktowy .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz, color=czy_promocja)) + geom_point() + geom_smooth(method = "lm", se = F) + xlab("Liczba klientów") + ylab("Sprzedaż") + scale_color_discrete(name = "Promocja?") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() + theme(legend.position = c(0.08,0.87)) ``` ] .pull-right[ ``` ## `geom_smooth()` using formula = 'y ~ x' ``` ![](04_wizualizacja_files/figure-html/unnamed-chunk-23-1.png)<!-- --> ] --- # Wykresy interaktywne [plotly](https://plotly.com/) to biblioteka do wykresów, która posiada swoją własną składnię. Za pomocą funkcji `ggplotly()` można zamienić każdy wykres ggplot2 na wykres interaktywny. --- # Wykres punktowy .pull-left[ ```r p <- ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz, color=czy_promocja)) + geom_point() + geom_smooth(method = "lm", se = F) + xlab("Liczba klientów") + ylab("Sprzedaż") + scale_color_discrete(name = "Promocja?") + ylim(0,20000) + ggtitle("Sprzedaż i liczba klientów w sklepie nr 11") + theme_light() plotly::ggplotly(p) ``` ] .pull-right[ ``` ## `geom_smooth()` using formula = 'y ~ x' ```
] --- # Histogram - `geom_histogram` Obowiązkowe argumenty `aes`: - x Domyślnie tworzy zawsze 30 słupków. --- # Histogram .pull-left[ ```r ggplot(sklep11, aes(x = liczba_klientow)) + geom_histogram() ``` Domyślnie tworzonych jest 30 słupków. ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-27-1.png)<!-- --> ] --- # Histogram - 12 słupków .pull-left[ ```r ggplot(sklep11, aes(x = liczba_klientow)) + geom_histogram(bins = 12) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-29-1.png)<!-- --> ] --- # Histogram - słupek = 100 klientów .pull-left[ ```r ggplot(sklep11, aes(x = liczba_klientow)) + geom_histogram(binwidth = 100) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-31-1.png)<!-- --> ] --- # Histogram - fill jako zmienna .pull-left[ ```r ggplot(sklep11, aes(x = liczba_klientow, fill = czy_promocja)) + geom_histogram(binwidth = 100) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-33-1.png)<!-- --> ] --- # Histogram - fill jako kolor .pull-left[ ```r ggplot(sklep11, aes(x = liczba_klientow)) + geom_histogram(binwidth = 100, fill = "blue") ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-35-1.png)<!-- --> ] --- # Krzywa gęstości .pull-left[ ```r ggplot(sklep11, aes(x = liczba_klientow)) + geom_density(fill = "blue") ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-37-1.png)<!-- --> ] --- # Grupy Funkcja `cut()` pozwala na stworzenie zmiennej jakościowej z ilościowej: ```r sklep11 <- sklep11 %>% mutate(klienci3=cut(x = liczba_klientow, breaks = c(min(liczba_klientow),1000,1500,max(liczba_klientow)), labels = c("do 1000", "1000-1500", "powyżej 1500"), include.lowest = T)) ``` --- # Wykres słupkowy - `geom_bar` / `geom_col` - `geom_bar` - funkcja sama oblicza wartości do wyświetlenia na podstawie zbioru danych jednostkowych - `geom_col` - funkcja otrzymuje już obliczone wartości (dane zagregowane) --- # Wykres słupkowy - `geom_bar` .pull-left[ ```r ggplot(sklep11, aes(x = klienci3)) + geom_bar() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-40-1.png)<!-- --> ] --- # Wykres słupkowy - `geom_bar` .pull-left[ ```r ggplot(sklep11, aes(x = klienci3)) + geom_bar(fill = "#99d8c9") ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-42-1.png)<!-- --> ] --- # Wykres słupkowy - `geom_col` .pull-left[ ```r n_klieci3 <- sklep11 %>% count(klienci3) ggplot(n_klieci3, aes(x = klienci3, y = n)) + geom_col() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-44-1.png)<!-- --> ] --- # `facet_wrap` .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + facet_wrap( ~ czy_promocja) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-46-1.png)<!-- --> ] --- # `facet_wrap` .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + facet_wrap(dzien_tyg ~ czy_promocja) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-48-1.png)<!-- --> ] --- # `facet_wrap` .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + facet_wrap(dzien_tyg ~ czy_promocja, nrow = 2) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-50-1.png)<!-- --> ] --- # `facet_grid` .pull-left[ ```r ggplot(sklep11, aes(x=liczba_klientow, y=sprzedaz)) + geom_point() + facet_grid(dzien_tyg ~ czy_promocja) ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-52-1.png)<!-- --> ] --- # Wykres pudełkowy - `geom_boxplot` Obowiązkowe argumenty `aes`: - x - zmienna grupująca (tekstowa/faktor) - y - zmienna analizowana --- # Wykres pudełkowy .pull-left[ ```r ggplot(sklep11, aes(x=czy_promocja, y=sprzedaz)) + geom_boxplot() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-54-1.png)<!-- --> ] --- # Wykres pudełkowy .pull-left[ ```r ggplot(sklep11, aes(x=czy_promocja, y=sprzedaz)) + geom_boxplot() + coord_flip() ``` ] .pull-right[ ![](04_wizualizacja_files/figure-html/unnamed-chunk-56-1.png)<!-- --> ] --- class: inverse # Zadanie Stwórz następujący wykres ![](04_wizualizacja_files/figure-html/unnamed-chunk-57-1.png)<!-- -->
−
+
10
:
00
--- # Zadania Wykonaj zadania zamieszczone na [stronie](http://www.wawrowski.edu.pl/ppr/presentations/04_wizualizacja_zadania.html). Bootcamp z zadaniami z przetwarzania i wizualizacji: https://r-bootcamp.netlify.app/