7  Typy wykresów

Typ wykresu Typ (ang) ggplot2
Histogram Histogram geom_histogram()
Wykres gęstości Density plot geom_density()
Wykres słupkowy Bar plot geom_bar(), geom_col()
Wykres linniowy Line plot geom_line()
Wykres rozrzutu Scatter plot geom_point()
Wykres pudełkowy Box plot geom_boxplot()
Wykres skrzypcowy Violin plot geom_violin()
Wykres kropkowe Dot plot geom_point() + coord_flip()
Heatmapy Heatmap geom_tile()
Wykres grzbietowe Ridgeline plot ggridges::geom_density_ridges()
Dystrybuanta CDF plot stat_ecdf()
Wykres mozaikowe Mosaic plot ggmosaic: geom_mosaic()
Tree map Tree map treemapify::geom_treemap()
data("gapminder", package = "gapminder")
dane2007 <- subset(gapminder, year==2007)

7.1 Histogram

  • Graficzny sposób przedstawiania rozkładu liczebności dla wybranej zmiennej.

  • Wykres został poraz pierwszy wprowadzony przez Pearsona w 1895 roku.

  • Wykres powstaje w dwóch etapach:

    1. Zakres wartości danych dzielony jest na rozłączne przedziały o równej szerokości,
    2. Dla każdego przedziału rysowane są słupki o wysokości równej liczbie obserwacji w każdym przedziale.
  • Dobór przedziałów jest istotny. Różne przedziały mogą pokazać różną informację.

  • Pakiet ggplot2 domyślnie definiuje przedział jako zakres/30. Ustawienia te można zmienić używając parametru *bins* (liczba przedziałów) lub *binwidth* (szerokość przedziału).

#HISTOGRAM
ggplot(dane2007, aes(x = gdpPercap)) + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#HISTOGRAM
ggplot(dane2007, aes(x = gdpPercap)) + geom_histogram(bins = 15)

#HISTOGRAM
ggplot(dane2007, aes(x = gdpPercap)) + geom_histogram(binwidth=10000)

Wykonać histogram dla zmiennej lifeExp dla 2007 roku. Ustawić szerokość przedziałów co 5 lat.

Solution

Rozwiązanie:

ggplot(dane2007, aes(x = lifeExp)) + geom_histogram(binwidth=5)   

7.2 Wykres słupkowy

  • wizualizacja danych jakościowych - tj. częstość występowania zmiennej jakościowej (np. liczba państw na danym kontynencie).
ggplot(dane2007, aes(x = continent)) + geom_bar()

  • wizualizacja danych ilościowych według kategorii - np. PKB na osobę w poszczególnych państwach.
gapminder_sel = gapminder %>% 
  filter(country %in% c("Poland", "Germany", "Czech Republic", "Slovak Republic") & year == 2007)

ggplot(data = gapminder_sel, aes(x = fct_reorder(as.factor(country), gdpPercap), y = gdpPercap)) +
  geom_col() +
  labs(x = NULL, y = NULL, title = "PKB na osobę (USD, 2007)")

  • odwrócenie osi
ggplot(data = gapminder_sel, aes(x = fct_reorder(as.factor(country), gdpPercap), y = gdpPercap)) +
  geom_col() +
  labs(x = NULL, y = NULL, title = "PKB na osobę (USD, 2007)") +
  coord_flip()

7.3 Wykres liniowy

#Oblicza średnią oczekiwaną długość życia dla poszczególnych lat
library(dplyr)
by_year <- group_by(gapminder, year)
mean_lifeExp_by_year <- summarize(by_year, 
                                  srednia=mean(lifeExp))

#Wykres liniowy
ggplot(data = mean_lifeExp_by_year, aes(x = year, y = srednia)) + geom_line()

Wykonać wykres liniowy pokazujący jak zmieniała się średnia wartość gpdPercap w poszczególnych latach?

Solution

Rozwiązanie:

library(dplyr)
by_year <- group_by(gapminder, year)
mean_gdp_by_year <- summarize(by_year, 
                                  srednia=mean(gdpPercap))

#Wykres liniowy
ggplot(data = mean_gdp_by_year, aes(x = year, y = srednia)) + geom_line()  

7.4 Wykres rozrzutu

  • stosowany do pokazania zależności między zmiennymi
ggplot(data=dane2007, aes(x=gdpPercap, y=lifeExp)) + geom_point()

Zwizualizować zależnośc między długością trwania życia a liczbą ludności w 2007 roku.

Solution

Rozwiązanie:

ggplot(data=dane2007, aes(x=lifeExp, y=pop)) + geom_point()   

Wykonać wykres zależności między zmiennymi lifeExp oraz gdpPercap wykorzystując dane gapminder.

Solution

Rozwiązanie:

ggplot(data=gapminder, aes(x=gdpPercap, y=lifeExp)) + geom_point() 

7.5 Wizualizacja statystyk opisowych

7.5.1 Wykres pudełkowy

Obrazuje podstawowe statystyki opisowe oraz wartości odstające :

  • dolny kwartyl - dolna krawędz pudełka
  • mediana - linia środkowa
  • górny kwartyl - górna krawędź pudełka
  • linie pionowe oznaczają najbardziej ekstremalne wartości (1,5IQR ponad krawędź pudełka, dolna to 1,5IQR poniżej wartości dolnej krawędzi pudełka)
  • punkty oznaczają wartości odstające

Statystyki opisowe na wykresie pudełkowym
ggplot(data = gapminder, aes(x = year, y = lifeExp, group = year)) + geom_boxplot()

Wykonaj wykres pudełkowy w podziale na lata dla zmiennej gdpPercap.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = year, y = gdpPercap, group = year)) + geom_boxplot()  

Wykonaj wykres pudełkowy w podziale na kontynenty dla zmiennej gdpPercap. Wykorzystaj zbiór danych gapminder.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = continent, y = gdpPercap)) + geom_boxplot() 

7.6 stat_summary

Funkcja stat_summary pozwala na wizualizację dowolnych statystyk opisowych bez konieczności wcześniejszego obliczania ich z wykorzystaniem np. funkcji dplyr::summarize().

  • wizualizacja średnich wartości zmiennej lifeExp w poszczególnych latach
ggplot(data = gapminder, aes(x = year, y = lifeExp)) + 
  stat_summary(fun = "mean", geom = "line")

Wykonaj wykres pokazujący jak zmieniała się wartość średnia PKB na osobę (zmienna gdPercap) w latach 1952-2007.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = year, y = gdpPercap)) + 
  stat_summary(fun = "mean", geom = "line")    
  • wizualizacja mediany dla zmiennej lifeExp w poszczególnych latach
ggplot(data = gapminder, aes(x = year, y = lifeExp)) + 
  stat_summary(fun = "median", geom = "line")

  • wizualizacja wartości średniej (punkt), oraz minimalnej i maksymalnej

obiekt geometryczny pointrange wymaga zdefiniowania 3 funkcji: określającej położenie punktu (argument fun), oraz “wąsów” (argumenty fun.min oraz fun.max)

ggplot(data = gapminder, aes(x = year, y = lifeExp)) +
  stat_summary(fun = mean,
               geom = "pointrange",
               fun.min = min,
               fun.max = max)

Wykonaj wykres pokazujący jak zmieniała się wartość średnia, minimalna oraz maksymalna PKB na osobę (zmienna gdPercap) w latach 1952-2007.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = year, y = gdpPercap)) +
  stat_summary(fun = mean,
               geom = "pointrange",
               fun.min = min,
               fun.max = max)
  • wizualizacja wartości średnich +/- odchylenie standardowe
ggplot(data = gapminder, aes(x = year, y = lifeExp)) +
  stat_summary(fun = mean,
               geom = "pointrange",
               fun.max = function(x) mean(x) + sd(x),
               fun.min = function(x) mean(x) - sd(x))

Wykonaj wykres pokazujący wartości śrendnie \(\pm\) odchylenie standardowe dla zmiennej gdpPercap.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = year, y = gdpPercap)) +
  stat_summary(fun = mean,
               geom = "pointrange",
               fun.max = function(x) mean(x) + sd(x),
               fun.min = function(x) mean(x) - sd(x))  
  • przebieg minimalnych i maksymalnych wartości lifeExp w latach 1952 - 2007
ggplot(gapminder, aes(x = year, y = lifeExp)) +
  stat_summary(fun = mean, geom = "ribbon", fill = "blue", 
               fun.max = min, fun.min = max)

7.7 Warstwy - łączenie różnych typów wykresów

Pakiet ggplot2 pozwala także na łączenie ze sobą różnych typów wykresów.

  • wizualizacja średniej zmienności oczekiwanej długości trwania życia w latach 1952-2007
#Oblicza średnią oczekiwaną długość życia dla poszczególnych lat
library(dplyr)
by_year <- group_by(gapminder, year)
mean_lifeExp_by_year <- summarize(by_year, 
                                  srednia=mean(lifeExp))

#Wykres liniowy
ggplot(data = mean_lifeExp_by_year, aes(x = year, y = srednia)) + 
  geom_line() + 
  geom_point()

Zwizualizuj średnią zmienność PKB na osobę (zmienna gdpPercap) w latach 1952-2007

Solution

Rozwiązanie:

by_year <- group_by(gapminder, year)
mean_gdp_by_year <- summarize(by_year, 
                                  srednia=mean(gdpPercap))

#Wykres liniowy
ggplot(data = mean_gdp_by_year, aes(x = year, y = srednia)) + 
  geom_line() + 
  geom_point()    
  • dodanie wartości średniej (czerwony punkt) do wykresu pudełkowego
ggplot(data = dane2007, aes(x = continent, y = lifeExp)) + 
  geom_boxplot() + 
  stat_summary(fun =mean, geom="point", shape=20, size=5, color="red", fill="red") 

Wykonaj wykres pudełkowy dla zmiennej gdPercap w podziale na lata oraz dodaj do wykresu punkt oznaczający średnią wartość.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = year, y = gdpPercap, group = year)) + 
geom_boxplot() + 
stat_summary(fun =mean, geom="point", shape=20, size=5, color="red", fill="red") 
  • dodanie wartości obserwacji do wykresu pudełkowego
ggplot(data = dane2007, aes(x = continent, y = lifeExp)) +
  geom_boxplot() +
  geom_point()

ggplot(data = dane2007, aes(x = continent, y = lifeExp)) +
  geom_boxplot() +
  geom_jitter()

Wykonaj wykres pudełkowy dla zmiennej lifeExp w podziale na lata. Dodaj do wykresu punkty oznaczające poszczególne obserwacje.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = year, y = lifeExp, group = year)) + 
  geom_boxplot() +
  geom_jitter()
  • wizualizacja statystyk opisowych długości trwnia życia (zmienna lifeExp) w Europie w latach 1952-2007
gapminder %>% 
  filter(continent == 'Europe') %>% 
  ggplot(aes(x = year, y = lifeExp)) +
  stat_summary(fun = mean, geom = "ribbon", alpha = .3, fill = "#1E90FF", fun.max = min, fun.min = max) +
  stat_summary(fun = mean, geom = "pointrange", fun.max = min, fun.min = max, color = "darkblue") +
  stat_summary(fun = max, geom = "line", color = "black") +
  stat_summary(fun = min, geom = "line", color = "black")

Zwizaulizuj statystyki opisowe (min, max, średnią) PKB na osobę (zmienna gdpPercap) w Azji w latach 1952-2007

Solution

Rozwiązanie:

gapminder %>% 
  filter(continent == 'Asia') %>% 
  ggplot(aes(x = year, y = gdpPercap)) +
  stat_summary(fun = mean, geom = "ribbon", alpha = .3, fill = "#1E90FF", fun.max = min, fun.min = max) +
  stat_summary(fun = mean, geom = "pointrange", fun.max = min, fun.min = max, color = "darkblue") +
  stat_summary(fun = max, geom = "line", color = "black") +
  stat_summary(fun = min, geom = "line", color = "black")  

7.7.1 Wizualizacja danych w grupach

Wizualizacja danych w podziale na grupy może być wykonana m.in za pomocą wykresu pudełkowego (geom_boxplot()), wykresu skrzypcowego (geom_violin()), lub za pomocą tzw. multiwykresów (facet_grid())

ggplot(data = dane2007, aes(x = continent, y = lifeExp)) +
  geom_boxplot()

ggplot(data = dane2007, aes(x = continent, y = lifeExp)) +
  geom_violin()

Wykonaj wykres skrzypcowy dla zmiennej gdPercap w podziale na kontynenty.

Solution

Rozwiązanie:

ggplot(data = gapminder, aes(x = continent, y = gdpPercap)) +
  geom_violin() 

7.8 Multiwykresy

ggplot(data = dane2007, aes(x = gdpPercap, y = lifeExp)) +
  geom_point() +
  facet_wrap(~continent)

ggplot(data = dane2007, aes(x = lifeExp)) +
  geom_histogram() +
  facet_wrap(~continent)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Wykonaj multiwykres przedstawiający rozkład wartości zmiennej gdpPercap (na histogramie) w podziale na kontynenty.

Solution

Rozwiązanie:

ggplot(data = dane2007, aes(x = gdpPercap)) +
  geom_histogram() +
  facet_wrap(~continent)  

7.9 Zapisywanie wykresów

p <- ggplot(data = dane2007, aes(x = continent, y = lifeExp)) + 
  geom_boxplot() + 
  labs(x = "Kontynent", y = "Oczekiwana długość trwania życia")
ggsave(filename = "Wykres.pdf", plot = p)
ggsave(filename = "Wykres.png", plot = p, dpi = 300)

7.10 Inne typy wykresów

7.10.1 Wykresy kropkowe

gapminder_am2007 = filter(gapminder, continent == "Americas", year == 2007)
ggplot(gapminder_am2007, aes(fct_reorder(as.factor(country), lifeExp), lifeExp)) + 
  geom_point(size = 5, col = "#0000a1") +
  coord_flip() +
  labs(x = NULL, y = NULL, title = "Oczekiwana długość życia", 
       subtitle = "Kontynent: Ameryka, 2007")

7.10.2 Heatmapy

gapminder_am = filter(gapminder, continent == "Americas")
ggplot(gapminder_am, aes(year, fct_reorder(as.factor(country), lifeExp, tail, n = 1, .desc = FALSE),
                         fill = lifeExp)) +
  geom_tile() +
  labs(y = NULL, x = NULL, title = "Oczekiwana długość życia", 
  subtitle = "Kontynent: Ameryka", fill = NULL)

7.10.3 Wykresy gęstości

  • Dla jednej zmiennej
 ggplot(data = dane2007, aes(x = lifeExp)) +
  geom_density() +
  labs(x = NULL, y = "Udział krajów", subtitle = "Oczekiwana długość życia (2007)")

  • Dla dwóch zmiennych
gapminder19572007 = filter(gapminder, year %in% c(1957, 2007))
ggplot(data = gapminder19572007, aes(x = lifeExp, fill = as.factor(year))) +
  geom_density(alpha = 0.3) +
  labs(x = NULL, fill = "Rok:", y = "Udział krajów",
       subtitle = "Oczekiwana długość życia") +
  theme(legend.position = "bottom")

7.10.4 Wykresy grzbietowe

library(ggridges)
ggplot(data = gapminder, aes(x = lifeExp, y = year, group = year)) +
  geom_density_ridges(alpha = 0.2) + 
  labs(y = NULL, title = "Oczekiwana długość życia", x = NULL) +
  scale_x_continuous(breaks = seq(20, 80, 20)) +
  scale_y_continuous(breaks = seq(1950, 2010, 10))
Picking joint bandwidth of 3.88

7.10.5 Dystrybuanta (ang. cumulative distribution function - CDF)

ggplot(data = dane2007, aes(lifeExp)) +
  stat_ecdf() + 
  labs(y = "Udział", subtitle = "Oczekiwana długość życia (2007)", x = NULL)

7.10.6 Wykresy liniowe z wypełnionym obszarem

gapminder_pol = gapminder %>% filter(country == 'Poland')
ggplot(gapminder_pol, aes(year, gdpPercap)) +
  geom_line() +
  geom_area() +
  labs(x = NULL, y = NULL, title = "Polska", subtitle = "PKB na osobę (USD, 2007)")

7.10.7 Wykresy kołowe

gapminder2007_unique = gapminder %>%
  filter(year == 2007) %>% 
  group_by(continent) %>% 
  summarize(liczba = n())
ggplot(data = gapminder2007_unique, aes(y = "", x = liczba, fill = continent)) +
  geom_bar(stat = "identity") +
  coord_polar("x") +
  theme_void() + 
  geom_text(aes(label = continent), position = position_stack(vjust = 0.5), size = 8) + 
  theme(legend.position = "none")

7.10.8 Wykresy słupkowe - skumulowane

ggplot(data = gapminder2007_unique, aes(y = "", 
                                 x = liczba,
                                 fill = continent)) +
  geom_bar(stat = "identity", position = "stack") +
  coord_flip() 

  • wykres skumulowany słupkowy dla 3 zmiennych
gapminder5 = mutate(gapminder, 
                    gdpPercap_group = cut_number(gdpPercap, 3, 
                                                 labels = c("niska", "średnia", "wysoka")))
gapminder5_sum = count(gapminder5, gdpPercap_group, year)

ggplot(gapminder5_sum, aes(year, n, gdpPercap_group, fill = fct_rev(gdpPercap_group))) +
  geom_col(position = "stack") +
  labs(x = NULL, y = "Liczba krajów", fill = NULL, title = "Grupa zamożności")

7.10.9 Wykresy mozaikowe

gapminder5 = mutate(gapminder, 
                    gdpPercap_group = cut_number(gdpPercap, 3, 
                                                 labels = c("niska", "średnia", "wysoka")))
library(ggmosaic)
gapminder5_2007 = filter(gapminder5, year == 2007)
ggplot(data = gapminder5_2007) +
  geom_mosaic(aes(x = product(continent), fill = gdpPercap_group))

7.10.10 Tree map

library(treemapify)
ggplot(dane2007, aes(area = pop, fill = lifeExp, 
                          subgroup = continent, label = country)) +
  geom_treemap(col = "white") + 
  geom_treemap_subgroup_border() +
  geom_treemap_subgroup_text(place = "centre", grow = TRUE, alpha = 0.5, colour =
                             "black", fontface = "italic", min.size = 0) +
  geom_treemap_text(colour = "white", place = "topleft", reflow = TRUE, alpha = 0.75) +
  # guides(fill = "none") + 
  labs(fill = NULL, title = "Oczekiwana długość życia (2007)")