Visualizácia dát

Published

June 3, 2024

Táto online publikácia je súčasťou mojej bakalárskej práce, ktorá sa zaoberá problematikou vizualizácie dát a jej dôležitosťou. Je určená predovšetkým tým, ktorí si chcú osvojiť základné princípy vizualizácie dát a lepšie porozumieť ich interpretácii. V rámci tejto publikácie nájdete širokú škálu grafických reprezentácií dát, ktoré sú vytvorené v prostredí R a knižnice ggplot2. Aplikované princípy som spracovala najmä podľa knihy Better Data Visualisation (2021) od J. Schwabisha. Okrem toho sa tu zameriavame aj na estetický dizajn grafov a jeho vplyv na efektívnosť komunikácie s publikom. Veríme, že táto online platforma vám poskytne ucelený prehľad o vizualizácii dát a pomôže vám lepšie porozumieť tomu, ako dôležitá je vizualizácia dát v analytickom procese.

Potrebné súbory dát sú zverejnené vo voľne pristupnom depozitári https://github.com/daniela365/data .

Na správne fungovanie všetkých kódov bude potrebné mať nainštalované nasledujúce knižnice.

library(showtext)
font_add(family="Bahnschrift",regular = "Bahnschrift.ttf")
showtext_auto()
library(readxl)
library(dplyr)
library(ggplot2)
library(gridExtra)
library(forcats)
library(gghighlight)
library(ggbreak)   
library(tidyr)

Veľa z nás by sa opýtala otázku, prečo je vizualizácia dát potrebná? Na túto otázku by sme mohli jednoducho odpovedať našim príslovím, “radšej raz vidieť ako stokrát počuť.”Vizualizácia je silný nástroj prostredníctvom ktorého vieme reprodukovať informácie. Vizualizácia dát nie je len výsledný graf, ide o dlhší proces. Na začiatok musíme vedieť čo chceme publikovať, a pre koho bude naša práca určená. Ďalej samozrejme potrebujeme dáta, na ktorých je založený celý proces, až potom volíme typ vizualizácie a pracujeme na detailoch.

1 5 základných princípov vizualizácie dát

1.1 Ukázať dáta

Podstatou práce s dátami je vedieť ich zredukovať, nesnažiť sa do grafu natlačiť veľa údajov. Stačí ukázať dáta, ktoré sú potrebné pre náš “príbeh”. Musíme sa rozhodnúť koľko dát a ako dáta zobrazíme, aby boli pre čitateľa ľahko pochopiteľné.

Tento prvý bod budeme ilustrovať na nasledujúcom príklade. Máme dáta pozitivity covid 19 vo vybraných okresoch Slovenska z roku 2022. Našou úlohou je poukázať na okresy Trnava a Zvolen. Na obrázku máme zobrazené všetky vybrané okresy. Je nemožné vyčítať pozitivitu v okresoch Nitra a Trnava, pretože graf je príliš preplnený. Na grafe sme zvýraznili potrebné okresy, odstránili legendu a priamo označili údaje. Takto okamžite vieme z kriviek vyčítať, ako sa pozitivita vyvíjala.

agTesty=read_excel("OpenData_Slovakia_Covid_AgTests_District.xlsx")
testy=agTesty%>%
  filter(District=="Okres Banská Bystrica" | District=="Okres Zvolen"|
           District=="Okres Bratislava"|District=="Okres Prešov"
         |District=="Okres Nitra"|District=="Okres Trnava"
         |District=="Okres Košice"|District=="Okres Žilina"
         |District=="Okres Poprad"|District=="Okres Kežmarok"|
           District=="Okres Trenčín")%>%
  filter(as.Date(Date)>"2022-08-28")%>%
  mutate(pozitivita=Ag_Pos/Total,datum=as.Date(Date))
g5=ggplot(testy)+
  geom_line(mapping = aes(x=datum,y=pozitivita,color=District),size=1)+
  theme_minimal()+
  xlab("")+ylab("")+theme(legend.title=element_blank())+
  theme(text = element_text(family = "Bahnschrift"),
        panel.grid = element_blank())+
  ggtitle("Pozitivita vo vybraných okresoch")
g5

library(gghighlight)
g6=ggplot(testy)+
  geom_line(mapping = aes(x=datum,y=pozitivita,color=District),size=1)+
  xlab("")+ylab("")+theme(legend.title=element_blank())+theme_minimal()+
  theme(plot.title = element_text(size=20),
        text = element_text(family = "Bahnschrift",size=18),
        panel.grid = element_blank())+
  ggtitle("Pozitivita vo vybraných okresoch")+
  gghighlight(District == c('Okres Zvolen','Okres Trnava'),
              use_direct_label = T) +
  theme(legend.position="none")
g6

1.2 Redukovať prebytok

Používanie rôznych vizuálnych efektov ruší čitateľa a zapĺňa graf. Snažme sa vyhnúť zbytočným efektom. Takmer v každom prípade vieme odstrániť hrubé čiary, mriežku. Niektoré grafy často používajú rôzne štvorce, trojuholníky a iné tvary na roztriedenie dát podľa skupín. Alebo rôzne výplne, gradienty farieb. Iné používajú príliš veľa textu, nápisy, zbytočne označovanie údajov a pod. Nikdy nepoužívajme 3D efekt, ak zobrazujeme dáta iba v osi x, y. Tieto rušivé elementy vieme takmer v každom prípade odstrániť. V tomto prípade sa držme pravidla, menej je viac. Nechceme naše dáta pohltiť efektami, chceme ich vždy zobraziť najjasnejšie.

Pri pohľade na stĺpcový graf nás napadne slovo neporiadok a chaos. Všetky tie efekty nás úplne pohltia, a ani si nevšimneme, čo graf zobrazuje. Mimochodom graf zobrazuje počet vykonaných Ag testov počas štyroch dní v okresoch Kežmarok a Poprad v roku 2022. 3D efekt stĺpcov skresľuje hodnoty. Ak sa pozrieme na poslednú hodnotu 50, z priameho pohľadu je stĺpec pod touto hodnotou. Legenda je príliš malá, v sivom pozadí zaniká a musíme ju hľadať. Je zbytočné označovať jednotlivé počty nad stĺpcami, ak máme zobrazenú vertikálnu os, a naopak. Tento graf sa dá ľahko prerobiť.

Odstránením 3D efektu v grafe sme tento graf zjednodušili. Naše dáta sa stali ľahšie čitateľné, a náš mozog automaticky vníma, čo graf znázorňuje. Ponechali sme len os a vymazali údaje nad stĺpcami. Legendu sme presunuli pod nápis. Ihneď vidíme, že modrá patrí Kežmarku a zelená Popradu. Množstvo detailov - paletu farieb, font písma, umiestenie legendy často vyberáme podľa vlastného vkusu.

testy2=agTesty%>%
  filter(District=="Okres Poprad"|District=="Okres Kežmarok")%>%
  filter(as.Date(Date)>"2022-10-01" & as.Date(Date)<"2022-10-06")%>%
  mutate(pozitivita=Ag_Pos/Total,datumy=as.Date(Date))


g7=ggplot(testy2)+
  geom_col(mapping = aes(datumy,Total,fill=District),
           position = "dodge")+
  theme_minimal()+
  theme(text = element_text(size = 17,family="Bahnschrift")) +
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank())+
  ggtitle("Počet vykonaných Ag testov")+
  theme(title = element_text(face="bold"))+
  theme(legend.position = "top",legend.title = element_blank(),
        legend.text = element_text(size=15,family="Bahnschrift"))+
  xlab("")+ylab("")+scale_fill_manual(values=c("dodgerblue",'forestgreen'))
g7

1.3 Prepojenie grafu a textu

Napriek tomu, že našou úlohou je vytvárať grafy nesmieme zabúdať aj na text. Ten je tiež dôležitou súčasťou procesu vizualizácie. Predstavme si situáciu, keď čitateľ číta text, v ktorom opisujeme náš graf, ktorý sa nachádza na ďalšej strane. Musí neustále otáčať stránku. Preto je dôležité správne prepojiť text a graf. Text opisujúci graf by mal byť v jeho blízkosti. Aj samotný graf vyžaduje prácu s textom. Máme niekoľko hlavných trikov, ako to urobiť efektívne. Či sa jedná o nadpis, označenia údajov, legendy a pod.

1.3.1 Označenie údajov priamo

Snažme sa namiesto legendy označiť údaje priamo do grafu. Dve, tri farby v legende ešte plnia svoju úlohu efektívne. Avšak pri použití viacerých farieb sa graf stáva neprehľadným.

Na nasledujúcich dvoch grafov opäť máme zobrazenú pozitivitu v štyroch okresoch. V prvom grafe musíme neustále pozerať na legendu, aby sme vedeli rozlíšiť krivky. Graf môžeme vylepšiť odstránením legendy a pridaním názvov priamo do grafu. Názvy sme rozlíšili aj farebne, aby boli v súlade s farbami kriviek.

library(gghighlight)

g5+gghighlight(District == c('Okres Nitra','Okres Trnava',
                             'Okres Kežmarok','Okres Poprad'),
               use_direct_label = F) +
  xlab("")+ylab("")+theme_minimal()+
  theme(legend.title=element_blank())+
  theme(text = element_text(size = 17,family = "Bahnschrift")) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank())+
  theme(legend.position = "top",
        legend.text = element_text(size=15))

g5+gghighlight(District == c('Okres Nitra','Okres Trnava',
                             'Okres Kežmarok',
                             'Okres Poprad'),
               use_direct_label = T) +
  xlab("")+ylab("")+theme_minimal()+
  theme(legend.position="none")+
  theme(text = element_text(size = 17,family="Bahnschrift")) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank())

Existuje množstvo iných spôsobov ako zakomponovať popisy priamo do grafu. Pre ilustráciu požijeme graf, ktorý zobrazuje počet vykonaných Ag testov. Namiesto legendy sme označili stĺpce. Hneď je jasné, že zelený stĺpec reprezentuje okres Poprad a modrý Kežmarok.

testy_vyber <- testy2 %>%
  filter(as.Date(Date)=="2022-10-02" )

ggplot(testy2)+
  geom_col(mapping = aes(datumy,Total,fill=District),
           position = "dodge")+
  theme_minimal()+
  theme(text = element_text(size = 17,family="Bahnschrift")) +
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank())+
  ggtitle("Počet vykonaných Ag testov")+
  theme(title = element_text(face="bold"))+
  theme(legend.position = "none")+
  xlab("")+ylab("")+scale_fill_manual(values=c("dodgerblue",'forestgreen'))+
   annotate("text",x=as.Date("2022-10-02")-0.22, y=3, label= "KEŽMAROK", col="white", size=4.5,family="Bahnschrift")+
  annotate("text",x=as.Date("2022-10-02")+0.22, y=3, label= "POPRAD",
           col="white", size=4.5,family="Bahnschrift")

Ak by označenie údajov preplňovalo graf, nie je zakázané použiť legendu. Avšak aj tá by mala spĺňať pravidlá. Legenda by mala byť zoradená podľa dát v grafe. Musíme tiež zvoliť vhodnú farbu alebo znaky na rozlíšenie. Taktiež je dôležité umiestnenie legendy, veľkosť písma.

1.3.2 Nadpis

Nadpis by mal obsahovať kľúčové informácie o našich dátach. Nemal by byť príliš dlhý, pretože čitateľ ho automatiky nedočíta do konca. Našou úlohou je čitateľa osloviť. Preto zapojme kreativitu a píšme nadpisy ako titulky článkov. Áno, nie je to možné úplne v každom prípade. Použitím krátkych a stručných nadpisov nič nepokazíme.

Čo je ešte dôležité pri písaní nadpisov?

Hierarchia: Najdôležitejšie informácie by mali mať prioritu, a mali by byť zahrnuté do nadpisu. Odlíšené najhrubším a najväčším písmom. Ale stále dbajme na ostatné princípy.

Použitie farieb: Použitie farieb v nadpisoch je efektívny spôsob, ako upútať pozornosť čitateľa. Napríklad v grafe môžme zahrnúť farbu do nadpisu namiesto popisov v stĺpcoch: “Počet vykonaných Ag testov v okresoch Kežmarok, Poprad.

1.3.3 Anotácie

Anotácie sú skutočným prínosom, keď chceme upozorniť na konkrétne body alebo časti grafu. Zvyčajne sú nimi odľahlé a extrémne hodnoty. Môžeme text, poznámku zahrnúť priamo do grafu. Tento spôsob ilustrujeme na čiarovom grafe, ktorý zobrazuje dáta nezamestnanosti v USA v rokoch 2000-2020. Pridáme tam popis udalosti, aby čitateľ lepšie porozumel zmeny v čase. V tomto prípade prudký nárast nezamestnanosti spôsobila pandémia ochorenia Covid.

USnezamestnanost=read_excel("us-unemployment.xlsx")
USnezamestnanost$date=as.Date(USnezamestnanost$date)
ggplot(USnezamestnanost)+
  geom_line(mapping = aes(date,unemploymentRate),
            color="dodgerblue",size=1)+
  theme_minimal()+
  theme(axis.line.x = element_line(size = 1))+
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank())+
  xlab("")+ylab("")+
  scale_x_date(date_breaks = "2 years",date_labels = "%Y")+
  scale_y_continuous(limits = c(0, 15), breaks = seq(0, 15, 2))+
  theme(text = element_text(family = "Bahnschrift",size=17))+
  ggtitle("Miera nezamestnanosti v USA 2000-2020")+
  annotate("rect", xmin=as.Date('2020-01-01'),
           xmax = as.Date('2020-10-01'),
           ymin = 0,
           ymax = 15,
           alpha = 0.3, fill="grey")+
  annotate("text",x=as.Date('2018-10-01'), y=14, 
           label= "Pandémia
      Covid",
           col="black", size=5,family="Bahnschrift")

1.4 Vyhnúť sa “špagetovému” grafu

Špagetový graf nazývame čiarový graf s množstvom kriviek. Tento graf je veľmi neprehľadný a pôsobí preplnene. Na nasledujúcom grafe máme dáta popularity dvanástich dievčenských mien v USA v rokoch 1880-2015 (z R knižnice babynames).

library(babynames)
data <- babynames %>% 
  filter(name %in% c("Mary","Emma", "Ida", "Ashley", "Amanda", 
                     "Jessica",  "Patricia", "Linda", "Deborah",
                     "Dorothy", "Betty", "Helen")) %>%
  filter(sex=="F")
ggplot(data)+
  geom_line(mapping = aes(year,n,color=name),size=0.8)+
  theme_minimal()+
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank())+
  xlab("")+ylab("")+
  ggtitle("Popularita mien v USA 1880-2015")+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(legend.title = element_blank(),
        legend.text = element_text(size=13,family="Bahnschrift"))

Je veľmi ťažké, až nemožné sledovať jednotlivé krivky. Rovnako sa strácame vo farbách. Jedným zo spôsobov vylepšenia tejto vizualizácie je rozbitie grafu na menšie grafy. Tieto grafy nazývame facety.

ggplot(data)+
  geom_line(mapping = aes(year,n,color=name),size=0.8)+
  facet_wrap(~name)+
  theme_minimal()+
  theme(panel.grid=element_blank())+
  xlab("")+ylab("")+
  ggtitle("Popularita mien v USA 1880-2015")+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(legend.position = "none")+
  theme(axis.line.x = element_line(size = 1))

Rozbitie grafu na malé časti má najmenej tri výhody. Po prvé, ak čitateľ porozumie ako čítať jeden graf, bude vedieť ako čítať ostatné. Po druhé. Tento spôsob nám umožní zobraziť množstvo dát, bez vytvorenia chaosu. Po tretie, čitateľ vie porovnávať dáta podľa kategórií. Pri tvorbe facetov, nesmieme zabudnúť na pravidlá. Malé grafy by mali byť logicky usporiadané, najčastejšie podľa abecedy. Ďalej by mali mať všetky rovnakú veľkosť, typ a veľkosť písma. Tiež by sme mali dodržať mierku osí, aby čitateľ vedel ľahko porovnávať. Grafy musia byť dostatočne veľké. Nezabudnime, že rozbíjame jeden celok, netvoríme samostatné grafy.

1.5 Začať so sivou

Základné princípy vizualizácie zakončíme najjednoduchším pravidlom - začať so sivou farbou. Vždy, keď budeme vytvárať graf začnime so sivými efektami. Položme si otázku, čo chceme a potrebujeme zvýrazniť. Postupne pridávajme farby, označenia a ďalšie elementy grafu.

2 Farby

Farby majú viditeľnú silu vo vizualizácii. Zjavne je to prvá vec, ktorú človek postrehne na našom grafe. Farby vedia evokovať emócie a upútavajú pozornosť. Mnohé úspešné značky používajú vlastnú paletu farieb. Požívajú ju vo vizualizácií svojho loga, web stránok, v novinách a pod.

Rozlišujeme 5 základných farebných paliet, ktoré môžeme aplikovať v našej vizualizácií.

  1. Binárna paleta. Používame pri odlíšení dvoch kategórií, napr. súhlasím/nesúhlasím, mestský/vidiecky, demokrat/republikán.
library(scales)
binary<- c("blue", "red")
show_col(binary,labels=FALSE,borders = 0)

  1. Sekvenčná paleta. Keď hodnoty dát je možné zoradiť od najnižších po najvyššie, potom ich môžeme vyfarbiť sekvenčnou paletou. Farby sa priraďujú k zoradeným hodnotám najčastejšie na základe svetlosti, odtieňa alebo oboch. Nízke hodnoty sú vyfarbené svetlými farbami, tie vysoké tmavými. Avšak, je to tak preto, lebo grafy majú zvyčajne biele alebo svetlé pozadie. V prípade tmavého pozadia je toto poradie opačne, vyššie hodnoty majú svetlejšie farby. Druhým rozmerom tejto sekvenčnej palety je odtieň. Je dovolené použiť jeden odtieň farby, meniacej svetlosť na označenie hodnôt. Na obrázku vidíme príklady sekvenčných paliet v programe R.
library(colorspace)
Warning: package 'colorspace' was built under R version 4.1.3
hcl_palettes(palette=c("Blues2","Reds2","Batlow","Hawai","Viridis"),
             plot = TRUE)

  1. Divergujúca paleta. Ak má naša premenná zmysluplnú centrálnu hodnotu, často používame divergujúcu paletu. Ide vlastne o dve sekvenčné palety, ktoré vychádzajú zo stredu do oboch strán. Centrálnej hodnote je priradená svetlejšia farba, takže tmavšie farby zobrazujú väčšiu vzdialenosť od centrálnej hodnoty. Touto paletou vieme rozlíšiť kladné a záporné hodnoty, alebo aj postupnosť silne nesúhlasím/neviem/silne súhlasím.
hcl_palettes(palette=c("Berlin","Cork","Tropic","Vik","Tofino"),
             plot = TRUE)

  1. Kategorická paleta Táto paleta sa používa, keď má premenná kategorický charakter. V tomto prípade nevieme využiť princíp zoradenia. Ide len o rozlíšenie kategórií, napríklad odlišné rasy, štáty, náboženstvo a pod. Každej kategórií je priradená jedna farba. Niekedy sa stáva, že máme kategórií príliš veľa. Museli by sme použiť veľa farieb, a graf by sa stal neprehľadný. Preto sa pri tejto palete musíme riadiť princípmi, ktoré sme zhrnuli vyššie.
my_cols <- c("steelblue", "gold", "firebrick", "forestgreen", 
             "orange", "grey", "black")
show_col(my_cols,ncol=7,labels = FALSE,borders = 0)

  1. Zvýraznenie. Ide o veľmi špeciálny prípad palety, ktorá chce zvýrazniť určitú skupinu alebo hodnotu vo vizualizácii.
highlighting=c("grey","grey","grey","dodgerblue","grey")
show_col(highlighting,labels = FALSE,ncol=5,borders = 0)

Čo je ešte dôležité pri výbere farieb? Hlavným pravidlom je vyhnúť sa používaniu predvolenej palete farieb. Rovnako sa vyhnime aj používaniu dúhovej palety. Paleta od svetlomodrej po tmavomodrú dáva logicky zmysel (sekvenčná paleta). Avšak fialová neznamená viac ako oranžová. Podľa typov dát vieme už zvoliť vhodnú paletu. Ak zobrazované kategórie majú vlastné “poznávacie” farby, napríklad športové tímy, politické strany, je vhodne ich využiť. Aby sme šetrili zrak čitateľov, farby by nemali mať vysokú úroveň sýtosti a jasu. Nesmieme zabúdať ani na fakt, že v populácií sú ľudia s rôznymi druhmi farbosleposti. Najčastejšie ide o neschopnosť rozlíšiť medzi odtieňmi červenej a zelenej. Na internete existuje množstvo stimulátorov, kde môžeme otestovať naše grafy a zistiť, či sú zrozumiteľné aj pre ľudí s týmto hendikepom. (https://www.color-blindness.com/coblis-color-blindness-simulator/)

V praxi sa stretávame s množstvom typov grafov. Niektoré pozná každý človek, iné nie sú veľmi rozšírené. Grafy môžeme rozdeliť do skupín, podľa toho, čo zobrazujú. Môžu zobrazovať početnosť, zmeny v čase, distribúcie, vzťahy a iné. V tejto časti práce si priblížime vybrané grafy a popíšeme základné pravidlá, aby sme správne pomocou vizualizácie interpretovali dáta. Samozrejme tu nebudú chýbať príklady so zaujímavými dátami.

3 Porovnávanie kategórií

Tieto grafy sa používajú na porovnávanie medzi kategóriami. Stĺpce, čiary, body umožňujú porovnávanie medzi skupinami a v skupinách.

3.1 Stĺpcový graf

Tento graf je najpoužívanejší a najviac pochopiteľný. Môžeme povedať, že s týmto typom grafu sa stretol takmer každý. Používa sa na zobrazenie hodnôt kvalitatívnych údajov na vodorovnej osi, a početností alebo frekvencií na zvislej osi. Stĺpcový graf je možné vytvoriť veľmi rýchlo, stačí nám iba pero a papier.

My si uvedieme pravidlá, ktoré dodržiavať pri tvorbe stĺpcového grafu na veľmi jednoduchom príklade. Použijeme dáta o počte obyvateľov vo vybraných európskych krajinách. V prvom grafe je ľahké nájsť krajinu s najmenším (Rakúsko) a najväčším (Nemecko) počtom obyvateľov, napriek tomu, že údaje nie sú presne vyčíslené. Ak dáta zoradíme podľa hodnoty je ľahšie uvidieť najmenšiu a najväčšiu hodnotu. Avšak táto stratégia nefunguje vždy. Napríklad pri väčšom počte krajín, by bolo lepšie zoradiť ich podľa abecedy. Dáta teda môžeme zoradiť tromi spôsobmi: podľa abecedy, vzostupne (zostupne), podľa dátumu (v prípade časovej osi x).

df <- data.frame(krajiny=c("Nemecko", "UK",
                           "Taliansko", "Poľsko",
                           "Belgicko","Rakúsko"),
                 pocet=c(83.2,67.8,58.8,40.7,11.6,8.9))
ggplot(df,aes(krajiny,y=pocet))+
  geom_bar(stat = "identity",fill="orange",width = 0.4)+
  xlab("")+ylab("")+
  theme_minimal()+
  # theme(text = element_text(size = 20)) 
  # geom_text(aes(label=pocet,vjust=0))+
  ggtitle("V Nemecku žije 9 krát viac obyvateľov ako v Rakúsku", 
          subtitle = "(v mil)")+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank())+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))

#zoradenie stlpcov 
ggplot(df,aes(reorder(krajiny,pocet),y=pocet))+
  geom_bar(stat = "identity",fill="orange",width = 0.4)+
  xlab("")+ylab("")+
  theme_minimal()+
  theme(aspect.ratio = 1/2)+
  # theme(text = element_text(size = 20)) 
  # geom_text(aes(label=pocet,vjust=0))+
  ggtitle("V Nemecku žije 9 krát viac obyvateľov ako v Rakúsku", 
          subtitle = "(v mil)")+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank())+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))

Ďalej si povieme niečo o základných pravidlách pri použití stĺpcového grafu.

Začať os v nule

Množstvo expertov a autorov súhlasí s pravidlom, ktoré zdôrazňuje začať os v nule. Predsa stĺpce porovnávame na základe dĺžky. Ak začneme os v hodnote 15 mil, po prvé hodnota Rakúsko sa nám stratí úplne. Po druhé, už samotný nadpis nedáva zmysel, keďže nevieme porovnať Nemecko s Rakúskom.

ggplot(df,aes(reorder(krajiny,pocet),y=pocet))+
  geom_bar(stat = "identity",fill="orange",width = 0.4)+
  xlab("")+ylab("")+
  theme_minimal()+
  theme(aspect.ratio = 1/2)+
  # theme(text = element_text(size = 20)) 
  # geom_text(aes(label=pocet,vjust=0))+
  ggtitle("V Nemecku žije 9 krát viac obyvateľov ako v Rakúsku", 
          subtitle = "(v mil)")+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank())+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))+
  coord_cartesian(ylim=c(15,95))+
  scale_y_continuous(breaks = c(15,55,95))

Neprerušovať os

Ďalšia chyba pri vizualizácií je prerušenie osi. V nasledujúcom grafe sme prerušili stĺpec vynechaním hodnôt 30-60. Dochádza ku skresleniu dĺžky stĺpcov. V grafe vidíme, že Poľsko je približne polovica z Nemecka. Avšak v tomto grafe to tak nevidíme.

library(ggbreak)   
ggplot(df,aes(x=reorder(krajiny,pocet),y=pocet))+
  geom_bar(stat = "identity",fill="orange",width = 0.4)+xlab("")+ylab("")+
  theme(aspect.ratio = 1/2)+ theme_minimal()+
  ggtitle("V Nemecku žije 9 krát viac obyvateľov ako v Belgicku",
          subtitle = "(v mil)")+
  theme(
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_blank()) +
  scale_y_break(c(30,60))+coord_flip()+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))

Mriežka

Mriežka pomáha čitateľovi nájsť presnú hodnotu. Ak je potrebná presná hodnota, môžeme údaj označiť nad stĺpec. Vtedy mriežku môžeme úplne odstrániť.

ggplot(df,aes(reorder(krajiny,pocet),y=pocet))+
  geom_bar(stat = "identity",fill="orange",width = 0.4)+
  xlab("")+ylab("")+
  theme_minimal()+
  theme(aspect.ratio = 1/2)+
  ggtitle("V Nemecku žije 9 krát viac obyvateľov ako v Rakúsku", 
          subtitle = "(v mil)")+
  theme(axis.text.y=element_blank(),legend.position = "none",
                          axis.ticks.y=element_blank())+
  theme(panel.grid = element_blank())+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))+
  geom_text(aes(label=pocet,vjust=-0.4),family="Bahnschrift")

Premeny stĺpcového grafu

Štandardný stĺpcový graf vieme modifikovať do viacerých podôb. Napríklad lízankový graf (lolipop chart), nahrádza stĺpce čiarami s guľôčkou na konci. V tomto prípade však nie je jasné, ktorá časť guľôčky reprezentuje presnú hodnotu. Avšak v tlačovej verzii ide o úspornejšiu možnosť.

ggplot(df,aes(x=reorder(krajiny,pocet),y=pocet))+
  geom_point(size=6,color="orange")+
  geom_segment(aes(x=reorder(krajiny,pocet),xend=reorder(krajiny,pocet),
                   y=0,yend=pocet),color="orange",size=1.5)+
  theme_minimal()+
  theme(plot.title = element_text(size=17),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("V Nemecku žije 9 krát viac obyvateľov ako v Belgicku",
          subtitle = "(v mil)")+
  ylab("")+xlab("")+
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank()) 

3.2 Párový stĺpcový graf

Jednoduchý stĺpcový graf je perfektný, ak porovnávame kategórie, napríklad počet obyvateľov medzi krajinami. Na porovnávanie v rámci kategórií je vhodnou možnosťou párový stĺpcový graf.

Graf zobrazuje očakávanú dĺžku života v šiestich krajinách Európy. Vidíme odhadovaný vek žien aj mužov. Vieme porovnávať medzi krajinami ale aj v krajinách. Vieme zhodnotiť v ktorej krajine žijú ženy najkratšie, v Bulharsku. Muži vo Švajčiarsku žijú dlhšie ako ženy na Slovensku. Samozrejme vidíme, že najmenší rozdiel medzi dĺžkou života mužov a žien je vo Švajčiarsku.

DZ=read_excel("DlzkaZivota.xlsx")

ggplot(DZ,aes(reorder(krajina,vek),vek,fill=pohlavie))+
  theme_minimal()+
  geom_bar(stat = "identity",position = position_dodge2())+
  xlab("")+ylab("")+
  ggtitle("V každej krajine žijú ženy dlhšie",
          subtitle="(Očakávaná dĺžka života v rokoch)")+
  theme(plot.title = element_text(size=18,face = "bold"),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(legend.title=element_blank(),legend.position = "top")+ 
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  scale_y_continuous(breaks = c(0,20,40,60,80))+
  coord_flip()+
  theme(legend.justification = c("left", "top"))+
  scale_fill_manual(values = c("Ženy" = "gold1",
                               "Muži" = "lightgreen"))

Predstavme si, že našou hlavnou úlohou je ukázať rozdiel medzi ženami a mužmi. V tomto prípade nemusíme použiť párový stĺpcový graf ale obyčajný stĺpcový graf. A ukázať len rozdiel. V grafe tak vidíme rozdiely hneď. V našej krajine tak vidíme, že ženy žijú o sedem rokov dlhšie ako muži.

DZ[1:6,]%>%
  ggplot(aes(krajina,rozdiel))+
  theme_minimal()+
  geom_bar(stat = "identity",width = 0.5,fill="steelblue")+
  xlab("")+ylab("")+
  ggtitle("Rozdiel očakávanej dĺžky života medzi ženami a mužmi",
          subtitle="(Rozdiel v rokoch)")+
  theme(plot.title = element_text(size=18,face = "bold"),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  scale_y_continuous(breaks = c(0,2,4,6,8))+
  ylim(c(0,8))+
  coord_flip()

Ďalším využitím párového grafu je zobrazenie zmien počas časového obdobia. V grafe vidíme populáciu v jednotlivých krajinách v rokoch 1961 až 2021. Opäť vidíme zmeny v každej krajine počas období, ale aj zmeny v jednotlivých rokoch medzi krajinami.

pop=read.csv("population.csv")
pop=pop%>%filter(Year=="2021"|Year=="2001"|Year=="1981"|Year=="1961")%>%
    filter(Entity=="Hungary"|
             Entity=="Switzerland"|
             Entity=="Austria"|
             Entity=="France"|
             Entity=="Poland")


ggplot(pop,aes(Entity,Population..historical.estimates./1000000,
               fill=as.factor(Year)))+
  geom_bar(stat = "identity",position = position_dodge2())+
  theme_minimal()+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  ggtitle("Zmena v populácií v rokoch 1961-2021",
          subtitle = "V miliónoch ľudí")+
  scale_fill_brewer(palette="Set2")+
  theme(legend.title = element_blank(),
        legend.position = "top",
        legend.justification = c("left","top"))+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_x_discrete(labels=c('Rakúsko', 'Francúzsko', 'Maďarsko',
                            'Poľsko', 'Švajčiarsko'))

3.3 Skladaný stĺpcový graf

Skladaný stĺpcový graf je ďalšou verziou stĺpcového grafu. Tento graf rozdelí skupiny do podskupín. Stĺpce môžu mať rovnakú dĺžku, teda každý stĺpec predstavuje 100 percent. Alebo môžu mať inú dĺžku, vyjadrujú počet v jednotlivých skupinách. Rovnako ako ostatné typy grafov, aj tento má svoje plusy a mínusy. Najväčšou výzvou je porovnávanie hodnôt v skupinách.

V grafe majú stĺpce rôzne dĺžky, reprezentujúce počet úmrtí spolu. To nám umožňuje porovnávanie medzi rokmi. Úmrtia spôsobené ochoreniami dýchacej sústavy sú najpočetnejšie v roku 2021. Tento záver vieme ľahko vysloviť vďaka zarovnaniu naľavo. V ktorom roku boli najpočetnejšie úmrtia spôsobené chorobami obehovej sústavy? K odpovedi na túto otázku, by sme zrejme potrebovali pravítko.

umrtia=read_excel("priciny.xlsx")
umrtia
# A tibble: 20 x 5
     Rok Pricina                   `Kód elementu...3` `Kód elementu...4` Pocet
   <dbl> <chr>                     <chr>              <chr>              <dbl>
 1  2021 Nádory                    POH0               VEK01              13039
 2  2021 Choroby obehovej sústavy  POH0               VEK01              28337
 3  2021 Choroby dýchacej sústavy  POH0               VEK01               6306
 4  2021 Choroby tráviacej sústavy POH0               VEK01               3195
 5  2021 Vonkajšie príčiny         POH0               VEK01               2476
 6  2020 Nádory                    POH0               VEK01              14027
 7  2020 Choroby obehovej sústavy  POH0               VEK01              27190
 8  2020 Choroby dýchacej sústavy  POH0               VEK01               3789
 9  2020 Choroby tráviacej sústavy POH0               VEK01               2889
10  2020 Vonkajšie príčiny         POH0               VEK01               2419
11  2019 Nádory                    POH0               VEK01              13500
12  2019 Choroby obehovej sústavy  POH0               VEK01              25220
13  2019 Choroby dýchacej sústavy  POH0               VEK01               4017
14  2019 Choroby tráviacej sústavy POH0               VEK01               2821
15  2019 Vonkajšie príčiny         POH0               VEK01               2640
16  2018 Nádory                    POH0               VEK01              13878
17  2018 Choroby obehovej sústavy  POH0               VEK01              25362
18  2018 Choroby dýchacej sústavy  POH0               VEK01               4175
19  2018 Choroby tráviacej sústavy POH0               VEK01               3085
20  2018 Vonkajšie príčiny         POH0               VEK01               2794
library(forcats)
ggplot(umrtia, aes(x =as.factor(Rok), y = Pocet, 
                         fill = fct_reorder(Pricina,Pocet))) +  
  geom_bar(stat = "identity",width=0.3)+
  theme_minimal()+
  ggtitle("Najčastejšie príčiny úmrtia obyvateľov v SR")+
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  ylab("")+xlab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_fill_brewer(palette = "Dark2")+
  coord_flip()+
  theme(legend.position = "top",
        legend.title = element_blank())+
  scale_y_continuous(labels = label_number
                     (suffix = " tisíc", scale = 1e-3))+
  guides(fill = guide_legend(reverse = TRUE)) 

Jedným zo spôsobov ako zarovnať všetky kategórie, je rozbitie grafu na menšie grafy. Teraz vieme odpovedať na predchádzajúcu otázku. Vidíme, že v roku 2021. Tu by sme mali pamätať na rovnakú šírku malých grafov.

ggplot(umrtia, aes(x =as.factor(Rok), y = Pocet, 
                   fill = Pricina)) +  
  geom_bar(stat = "identity",width=0.3)+
  theme_minimal()+
  facet_grid(~factor(Pricina, levels=c('Choroby dýchacej sústavy', 
                                       'Choroby obehovej sústavy', 
                                       'Choroby tráviacej sústavy', 
                                       'Nádory','Vonkajšie príčiny')))+
  ggtitle("Najčastejšie príčiny úmrtia obyvateľov v SR")+
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  ylab("")+xlab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_fill_brewer(palette = "Dark2")+
  coord_flip()+
  theme(legend.position = "none",
        legend.title = element_blank())+
  guides(fill = guide_legend(reverse = TRUE)) +
  scale_y_continuous(labels = label_number
                     (suffix = " tisíc", scale = 1e-3))+
  annotate("segment", x=-Inf, xend=Inf, y=-Inf, yend=-Inf,size=1.5)

Ďalším užitočným tipom je zobraziť najdôležitejšie (najpočetnejšie) údaje na spodok stĺpca resp. zarovnať naľavo. To spôsobí, že čitateľ vie rýchlo porovnávať údaje. Na našom príklade sme podskupiny zoradili od najpočetnejšej po najmenej početnú. V jednotlivých rokoch vidíme zoradené počty príčin úmrtí.

ggplot(umrtia, aes(x =as.factor(Rok), y = Pocet, 
                   fill = fct_reorder(Pricina,Pocet))) +  
  geom_bar(stat = "identity",width=0.3,position = position_fill())+
  theme_minimal()+
  ggtitle("Najčastejšie príčiny úmrtia obyvateľov v SR")+
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  ylab("")+xlab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_fill_brewer(palette = "Dark2")+
  coord_flip()+
  theme(legend.position = "top",
        legend.title = element_blank())+
  guides(fill = guide_legend(reverse = TRUE)) 

V niektorých prípadoch, ak máme veľa podskupín s nízkymi počtami, môžeme uvážiť ich zlúčenie do podskupiny - ostatné .

3.4 Divergujúci stĺpcový graf

Variáciou skladaného stĺpcového grafu, je graf, ktorého stĺpce divergujú zo stredu do oboch krajoch. Tento typ grafu je najčastejšie používaný, pri zobrazovaní usporiadaných odpovedí respondentov, od silno nesúhlasím až po silno súhlasím.

V nasledujúcom príklade máme vygenerované dáta odpovedí na otázky ohľadom spokojnosti s predajňou. Zoskupili sme odpovede - nesúhlasím, súhlasím, na opačné strany od pomysleného stredu. Preto vieme porovnať pravú a ľavú stranu medzi otázkami. Najviac boli zákazníci spokojný s cenami, naopak najmenej s čistotou predajne. Výhodou tejto vizualizácie je jasnosť v dátach. Najčastejšie nesúhlasy zobrazujeme naľavo (rovnako ako negatívne hodnoty), súhlasy napravo.

set.seed(1234)
#library(tidyverse)
library(scales)
library(forcats)
#vygenerujeme si odpovede
data <- data.frame(x = rep(c(
  "Personál v predajni sa ku mne správal zdvorilo", 
  "Zamestnanci obchodu mi ponúkli pomoc ", 
  "Predajňa bola čistá a uprataná",
  "Personál v predajni bol nápomocný", 
  "Bol som spokojný s cenami"), each = 50),
  y = sample(c("Silno nesúhlasím", "Nesúhlasím", 
               "Súhlasím", "Silno súhlasím"), 250, 
             replace = TRUE))
#vyjadrime jednotlive odpovede v %
dataSumarne <- data %>% 
  group_by(x, y) %>% 
  count(name = "pocetodpovedi") %>% 
  group_by(x) %>% 
  mutate(ypercentach= pocetodpovedi / sum(pocetodpovedi)) %>% 
  ungroup() %>% 
  mutate(ypercentachlabel = percent(ypercentach, accuracy = 1))
#upravime aby sme mali zaklad pre divergujuci graf
dataSummaryDiverging <- dataSumarne %>%
  mutate(ypercentach = if_else(y %in% c("Súhlasím", "Silno súhlasím"),
                               ypercentach, -ypercentach)) %>% 
  mutate(ypercentachlabel = percent(ypercentach, accuracy = 1))
#upravime aby sme nemali zaporne percenta
dataSummaryDivergingLabel <- dataSummaryDiverging %>%
  mutate(ypercentachlabel = abs(ypercentach)) %>% 
  mutate(ypercentachlabel = percent(ypercentachlabel, accuracy = 1))
#stlpce aby boli v dobrom poradi
dataSummaryDivergingLabelOrder <- dataSummaryDivergingLabel%>% 
  mutate(y = fct_relevel(y,
                         "Nesúhlasím", "Silno nesúhlasím",
                         "Súhlasím", "Silno súhlasím"),
         y = fct_rev(y)) 
library(showtext)
font_add(family="Bahnschrift",regular = "Bahnschrift.ttf")
showtext_auto()

dataSummaryDivergingLabelOrder%>%
  ggplot(aes(x =x, 
             y = ypercentach,
             fill = y)) +
  geom_col() +
  geom_text(aes(label =ypercentachlabel),
            position = position_stack(vjust = 0.5),
           color = "white",
            fontface = "bold",
            size=5) +
  coord_flip() +
  scale_x_discrete() +
  scale_fill_manual(breaks = c("Silno nesúhlasím", "Nesúhlasím",
                               "Súhlasím", "Silno súhlasím"),
                    values = c(
                      "Silno nesúhlasím" = "darkorange",
                      "Nesúhlasím" = "gold",
                      "Súhlasím" = "pink2",
                      "Silno súhlasím" = "pink4"
                    ))+
  labs(title = "Spokojnosť zákazníkov s predajňou",
       #subtitle = "(V percentách)",
       x = NULL,
       fill = NULL) +
  theme_minimal() +
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=17))+
  theme(plot.title = element_text(hjust = -1.25, vjust = 0),
        plot.subtitle = element_text(hjust = -0.64,vjust = -1,size = 15))+
  theme(axis.text.y = element_text(family = "Bahnschrift",size = 13))+
  theme(axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        panel.grid = element_blank(),
        legend.position = "top")+theme(legend.key.size = unit(0.7,"line"))

Aj tento graf má svoje mínusy. Napríklad v jednotlivých otázkach nevieme jasne porovnávať v a medzi skupinami. Inými slovami ťažšie sa porovnáva medzi počtom ľudí, ktorí celkovo súhlasia a nesúhlasia. Tento problém môžeme vyriešiť pridaním označení percent. To sme urobili v grafe.

Špeciálne musíme byť opatrní, ak máme aj neutrálnu kategóriu odpovedí. Teda respondenti k otázke majú neutrálny postoj, súhlasia aj nesúhlasia zároveň, alebo nemajú názor. Ak umiestnime neutrálnu kategóriu doprostred pozdĺž pomyslenej stredovej čiary, táto kategória bude rozdelená do opačných odpovedí. Tento graf môžeme rozbiť na dva grafy, vybraním neutrálnej kategórie. Alebo urobíme facety pre každú kategóriu. To umožní ľahko porovnávať medzi kategóriami a v kategóriach.

3.5 Bodový graf

Spomenuli sme už párový stĺpcový graf, na porovnávanie medzi kategóriami. Bodový graf je tiež jednoduchým nástrojom na porovnávanie medzi skupinami. V prípade viacerých skupín sú body vhodnejšie ako stĺpce, pretože nepreplňujú graf.

V tomto prípade máme graf zobrazujúci priemerný mesačný plat v krajinách podľa pohlavia. Plat bol vypočítaný z údajov pracujúcej populácie s vysokoškolským vzdelaním. Táto vizualizácia nie je zlá, ale nám ide o najjasnejšie zobrazenie dát.

dta2=read_excel("prijem-pohlavie-krajiny-bar.xlsx")

ggplot(dta2,aes(Krajina,Plat,fill=Pohlavie))+
  theme_minimal()+
  geom_bar(stat = "identity",position = position_dodge2())+
  coord_flip() +
  ylab("") +xlab("")+
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  ggtitle("Priemerná mesačná mzda podľa pohlavia",
          subtitle = "Pracujúca populácia s vysokoškolským vzdelaním")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_fill_manual(values = c("Ženy" = "chocolate1", "Muži" = "deepskyblue3"),
                     labels = c("Ženy", "Muži"),
                     name="")+
  theme(legend.position = "top",
        legend.justification = c("left","top"))+
  scale_y_continuous(labels = dollar_format(suffix = "€", prefix = ""),
                     limits = c(0, 6000), breaks = seq(0, 6000, by = 1000))

Našim prvým krokom je odstrániť stĺpce, a pridať len body, reprezentujúce mzdu žien a mužov. Ďalej sme body spojili čiarou, čím sme vytvoril efekt rozsahu. Názvy krajín sme umiestili tesne naľavo od bodov. Vidíme, že v každej z uvedených krajín ženy zarábajú menej ako muži. Na Slovensku je tento rozdiel najmenší. Avšak celkovo priemerné mzdy na Slovensku sú výrazne nižšie v porovnaní s ostatnými krajinami.

library(scales)
dta=read_excel("prijem-pohlavie-krajiny2023.xlsx")

dta%>%ggplot(aes(x=Krajina))+
  geom_linerange(aes(ymin = Ženy, ymax = Muži, x = Krajina),
                 size = 1.5, alpha = 0.25,color="grey2") +
  geom_point(aes(y = Ženy,colour="Ženy"),size=4) +
  geom_point(aes(y=Muži,colour="Muži"),size=4)+
  geom_text(aes(x = Krajina, y = Ženy, label = Krajina),
            vjust = 0.2, hjust = 1.2, size = 4, color = "gray44",
            family="Bahnschrift") +
  coord_flip() +
  ylab("") +xlab("")+
  theme_minimal() +
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  ggtitle("Priemerná mesačná mzda podľa pohlavia",
          subtitle = "Pracujúca populácia s vysokoškolským vzdelaním")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_color_manual(values = c("Ženy" = "chocolate1", "Muži" = "deepskyblue3"),
                     labels = c("Ženy", "Muži"),
                     name="")+
  theme(legend.position = "top",
        legend.justification = c("left","top"))+
  scale_y_continuous(labels = dollar_format(suffix = "€", prefix = ""),
                     limits = c(0, 6000), breaks = seq(0, 6000, by = 1000))+
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank())

Bodový graf nemusí porovnávať dve kategórie medzi sebou, môžeme ním vyjadriť aj zmenu medzi dvomi rokmi. Rovnako môžeme použiť iné symboly namiesto kruhov, a čiaru nahradiť šípkou. V bodovom grafe musíme byť opatrní na smer hodnôt. V našom grafe by to zanemelo, že plat ženy by prevyšoval plat mužov. Určite by sme automaticky považovali hodnotu naľavo pre ženy. V tomto prípade by sme mali použiť anotácie alebo zvýrazniť smer napríklad šípkou. Ďalšou možnosťou je rozdeliť graf na dve skupiny, jednu pre krajiny, kde plat ženy je vyšší, druhú s opačným prípadom.

4 Čas

V tejto časti sa budeme venovať grafom, ktoré zobrazujú zmeny v čase. Na príkladoch si ukážeme pravidlá pri práci s čiarovým grafom a jeho variáciami - sklonovým a plošným grafom. Na záver si ukážeme jeden netradičný graf popisujúci priebeh v čase, Ganttov graf.

4.1 Čiarový graf

Čiarový graf, spolu so stĺpcovým grafom, je jeden z najviac používaných grafov. Tento graf je jednoduchý na čítanie, jasne reprezentuje údaje. Hodnoty dát sú spojené čiarami, aby popisovali zmenu hodnoty v čase.

Čiarový graf popisuje priemernú konzumáciu mäsa v kilogramoch na osobu na Slovensku v období 2000-2020. Z grafu vieme vyčítať zmeny celkovo, ale vieme aj porovnávať medzi jednotlivými časovými úsekmi. Napriek tomu, že čiarový graf je ľahko vyprodukovať musíme tiež dbať na estetické a vecné prvky.

masosvk=read_excel("maso.xlsx")

masosvk%>%filter(Druh=="Spolu")%>%
  ggplot(aes(x=Rok,y=Kgos))+
  geom_line(color="green4",size=1)+
  theme_minimal()+xlab("")+ylab("")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  ggtitle("Konzumácia mäsa v SR (2000-2020)",
          subtitle = "V kilogramoch na osobu")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+ylim(0,70)+
  theme(axis.line.x = element_line(size = 1))

Neexistuje limit v počte zobrazovaných čiar. Nie je určený presný počet zobrazovaných čiar v jednom grafe. Kľúčom je riadiť sa tým, na čo chceme čitateľa upozorniť. Napríklad, môžeme zvýrazniť určitú skupinu dát. To sme zahrnuli v hlavných princípoch (ukázať dáta).

Ostaňme pri dátach o priemernej konzumácií mäsa. Povedzme, že chceme ukázať krivky pre krajiny Slovensko a Nemecko. Ale zároveň chceme ukázať aj vzťah k ostatným krajinám. Urobíme to zvýraznením týchto krajín farbami, ostatné necháme sivé. Vidíme, že krivka pre Slovensko je pod krivkou Nemecka. Môžeme tiež uviesť záver, že sú aj krajiny, ktoré predbehli Nemecko. V tomto grafe sme použili odlíšenie a zvýraznenie pomocou farby. Čitateľov zrak padne okamžite na tieto krivky, a vníma ich v popredí.

library(wesanderson)
library(gghighlight)
maso1=read.csv("per-capita-meat-consumption-by-type-kilograms-per-year.csv")
maso1=maso1%>%filter(Year>1999)%>%
  rename("Other"="Meat..Other...00002735....Food.available.for.consumption...0645pc....kilograms.per.year.per.capita"
  , "Sheep"="Meat..sheep.and.goat...00002732....Food.available.for.consumption...0645pc....kilograms.per.year.per.capita"
  ,"Beef"="Meat..beef...00002731....Food.available.for.consumption...0645pc....kilograms.per.year.per.capita"
  ,"Pig"="Meat..pig...00002733....Food.available.for.consumption...0645pc....kilograms.per.year.per.capita"
  
  ,"Poultry"="Meat..poultry...00002734....Food.available.for.consumption...0645pc....kilograms.per.year.per.capita")
maso1=maso1%>%mutate(Total=Other+Sheep+Beef+Pig+Poultry)
maso1=maso1%>%filter(Entity=="Slovakia"|Entity=="Germany"|Entity=="Austria"
               |Entity=="France"|Entity=="Italy"|Entity=="Poland"
               |Entity=="Netherlands"|Entity=="Finland"|Entity=="Russia")%>%
  mutate(Entity = recode(Entity, "Slovakia" = "Slovensko"))%>%
  mutate(Entity=recode(Entity,"Germany"="Nemecko"))


graf=ggplot(maso1,aes(x=Year,y=Total))+
  geom_line(aes(color=Entity),size=1.25)+
  theme_minimal()+xlab("")+ylab("")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  ggtitle("Konzumácia mäsa v krajinách (2000-2020)",
          subtitle = "(V kilogramoch na osobu)")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=15),
        text = element_text(family = "Bahnschrift",size=15))

graf+gghighlight(Entity == c("Slovensko","Nemecko"),
                 use_direct_label = T,keep_scales = TRUE)+
  scale_color_manual(values = c(rep("grey",4),"orange",rep("grey",3),"green4"))

Nemusíme začať os v nule. Pravidlo pre začínanie osi v nule sme zaviedli pri stĺpcovom grafe. To neplatí pri používaní čiarového grafu, pretože tu neznázorňujeme početnosť. Aký rozsah má mať os? Pozrieme sa bližšie na konzumáciu mäsa na Slovensku v rokoch 2015-2020. Za obdobie piatich rokov hodnota stúpla o 15 kg. Na obrázku si môžeme všimnúť, že os y ma rôzny rozsah. V ľavom hornom rohu rozsah osi je 0 - 70, vidíme mierny nárast. Neexistuje správna odpoveď, ktorý graf je najlepší. Všetko záleží na tom, aký máme príbeh ku grafu. Ak chceme poukázať na to, že hodnota presiahla 61 kg, najlepšou voľbou bude použiť graf so začiatkom v hodnote 46. Prvý a posledný graf je vhodný, ak rozprávame všeobecnejšie. Použiť začiatok v 45 môžeme, ak chceme detailnejšie ukázať zmeny v jednotlivých rokoch.

library(gridExtra)
library(gridGraphics)
m0=masosvk%>%filter(Rok>2014)%>%
  filter(Druh=="Spolu")%>%
  ggplot(aes(x=Rok,y=Kgos))+
  geom_line(color="green4",size=1)+
  theme_minimal()+xlab("")+ylab("")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
 
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))
m1=m0+scale_y_continuous(limits = c(0, 70), 
                                    breaks = seq(0, 70, by = 10))
m2=m0+scale_y_continuous(limits = c(40, 65), 
                         breaks = seq(0, 65, by = 5))
m3=m0+scale_y_continuous(limits = c(46, 62), 
                         breaks = seq(46, 62, by=3))
m4=m0+scale_y_continuous(limits = c(45, 70), 
                         breaks = seq(45, 70, by=10))
grid.arrange(m1, m3, m4, m2,
  nrow = 2,
  top=textGrob("Konzumácia mäsa na Slovensku stúpla o 15 kg medzi 2015 a 2020", 
               gp=gpar(fontsize=18,family="Bahnschrift")))

Graf so zápornými hodnotami

Poznamenajme prípad s kladnými a zápornými hodnotami. Vezmime graf s priemernou mesačnou teplotou v meste Poprad. Naľavo hneď nepostriehneme, že krivka je aj v záporných hodnotách. Je to preto, lebo automaticky považujeme začiatok v nule. Napravo sme os x zvýraznili. Hneď je jasnejšie, že hodnoty sú aj pod nulou.

Mesiac <- c(1:12)
Teplota <- c(-4.1,-2.7,1.1,5.9,11.3,14.2,15.8,15.3,11.3,6.5,0.9,-2.8)
pocasie=data.frame(Mesiac, Teplota)
p1=ggplot(pocasie,aes(x=Mesiac,y=Teplota))+
  geom_line(color="steelblue4",size=1)+theme_minimal()+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  ggtitle("V júli je v Poprade najteplejšie",
          subtitle = "(Priemerná mesačná teplota)")+
  ylim(-5,17)+
  scale_x_continuous(breaks = c(1:12))+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))
p2=p1+geom_hline(yintercept=0,size=0.8)
grid.arrange(p1,p2,ncol=2)

Používanie značiek na označenie hodnôt.

Ide o symboly na čiarach na zvýraznenie špecifických bodov. Ich používanie je subjektívne. Ak máme v grafe len zopár dát, je vhodné ich použiť, hodnoty sa tak stávajú jasnejšími.

To môžeme vidieť na grafe. Máme tam znázornenú priemernú konzumáciu bravčového mäsa na Slovensku. Napravo sme hodnoty označili kruhmi. Vidíme presnejšie jednotlivé hodnoty. Programy na tvorbu grafov ponúkajú množstvo symbolov, kruhy, štvorce, trojuholníky atď. V tomto prípade ide o estetiku, ale aj o logiku v ich výbere. Najvhodnejšie sú kruhy, pretože tie sú symetrické, a nezáleží na tom, kde ich čiara pretne. V opačnom prípade, napríklad záleží, či čiara pretne trojuholník vo vrchole alebo bude prechádzať stranou.

library(gridExtra)
b1=masosvk%>%filter(Druh=="Bravčovina")%>%
  ggplot(aes(x=Rok,y=Kgos))+
  geom_line(color="indianred1",size=1)+
  
  theme_minimal()+xlab("")+ylab("")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  ggtitle("Konzumácia bravčového mäsa v SR",
          subtitle = "V kilogramoch na osobu")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+ylim(25,40)+
  theme(axis.line.x = element_line(size = 1))
b2=b1+geom_point(aes(x=Rok,y=Kgos),color="indianred1",size=2.5)
grid.arrange(b1,b2,ncol=2)

Chýbajúce údaje.

Častokrát máme v dátach údaje, ktoré chýbajú z nejakých dôvodov. V grafe prerušia plynulosť krivky. Našou úlohou je jasne zobraziť, že tieto dáta nie sú kompletné. Napríklad môžeme zmeniť typ čiary, alebo nespojiť body. Taktiež môžeme pridať anotácie do grafu s popisom, že ide o chýbajúce dáta. Najhorším spôsobom je ignorovať chýbajúce dáta a urobiť graf neprerušovaný.

masosvk=read_excel("maso.xlsx")
h1=masosvk%>%filter(Druh=="Hydina")%>%
  ggplot(aes(x=Rok,y=Kgos))+
  geom_line(color="tan3",size=1)+
  geom_point(color="tan3",size=2,shape=16)+
  theme_minimal()+xlab("")+ylab("")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))+
  ylim(10,25)

h2=h1+geom_segment(aes(x = 2005, y = 20, xend = 2009, yend = 17.6),
             color="tan3",linetype="dashed",size=1)
grid.arrange(h1,h2,ncol=2)

Duálna os y

Graf s duálnou osou je známy aj ako combo graf. Dva typy grafov majú spoločnú os x, ale rôzne osi y. To umožňuje zobraziť do jedného grafu dva sety dát. Combo graf je najčastejšie tvorený z kombinácie čiarového grafu s čiarovým, stĺpcovým alebo plošným grafom.

Na obrázku máme, graf s duálnou osou. Stupnice na osi pravej a ľavej osi sú rozdielne. Graf vyjadruje priemernú konzumáciu hovädziny a hydiny V Nemecku. Pri skúmaní vidíme závažné chyby. Po prvé, nevieme povedať, ktorá os korešponduje s hodnotami pre hydinu, a opačne. Po druhé, zrak nám padne na miesta, kde sa čiary pretínajú. Napríklad, v roku 2001 sa čiary dotýkajú. Mylne by sme predpokladali, že tieto hodnoty sa rovnajú. V skutočnosti sú to hodnoty 10.65 a 14.42. Po tretie, pozrime sa na vodorovné čiary mriežky. Na ľavej strane sú zarovnané s číslom, avšak na pravej strane sú nad hodnotou.

coeff=1.35
maso1%>%filter(Entity=="Nemecko")%>%
  rename("Hovädzina" = "Beef")%>%
  rename("Hydina" = "Poultry")%>%
  ggplot(aes(x=Year))+
    geom_line(aes(y=Hovädzina,color="Hovädzina"),size=1)+
    geom_line(aes(y=Hydina/coeff,color="Hydina"),size=1)+
  scale_y_continuous(#name = "First Axis",
                     sec.axis = sec_axis(~.*coeff
                                      #, name="Second Axis"
                                      ))+
  theme_minimal()+
  ggtitle("Konzumácia hydiny a hovädziny v Nemecku",
          subtitle = "(V kg na osobu)")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))+
  scale_color_manual(name="",
                     values = c("Hovädzina" = "deepskyblue3", "Hydina" = "tan3"))+
  theme(legend.position = "top",legend.justification = c("left","top"))

Prečo nepoužívať duálnu os? Dáta sa ťažko interpretujú, nie je jasne, ktorá os s čím súvisí. Krížiace sa čiary vytvárajú omylné závery.

Ako napraviť graf s duálnou osou?

Najlepšou voľbou je vytvoriť malé grafy vedľa seba, s rôznymi osami. Nesmieme však zabudnúť vyznačiť, že osi nie sú rovnaké, pretože určite by sme ich začali porovnávať medzi sebou.

Kedy je graf s duálnou osou vhodný?

Mohli by sme si položiť otázku, načo vlastne hovoríme o grafe s duálnou osou, keď vo väčšine prípadov sa používa nevhodne? V prípade, že používame dve rôzne merné jednotky. Napríklad percentá a čas v sekundách. Na jednej osi budeme mať maximum 100 percent a na druhej 100 sekúnd.

Graf s duálnou osou je vhodný, ak chceme ukázať ako premenné spolu súvisia. Na grafe máme vymyslené dáta priemernej mesačnej teploty a priemernú mesačnú tržbu v stánku so zmrzlinou. Vidíme, že predaj zmrzliny závisí od počasia.

df=data.frame(Mesiac=c(1:12), 
           Teplota=c(14.2,16.4,11.9,15.3,18.5,22.2,20,25.1,23.3,18.4,16,12.3), 
           Zmrzlina=c(200,230,190,330,405,520,410,700,620,544,420,350))
coeff=35

ggplot(df,aes(x=Mesiac))+
  geom_line(aes(y=Teplota,color="Teplota"),size=1)+
  geom_line(aes(y=Zmrzlina/coeff,color="Zmrzlina"),size=1)+
  scale_y_continuous(name = "Teplota",
    sec.axis = sec_axis(~.*coeff
                        , name="Tržba"
    ))+
  scale_x_continuous(breaks = c(1:12))+
  theme_minimal()+
  ggtitle("Ako počasie ovplyvňuje predaj zmrzliny",
          subtitle = "(Priemerná mesačná teplota vs tržba)")+
  xlab("")+ylab("")+theme(panel.grid.major.x = element_blank(),
                          panel.grid.minor.x = element_blank())+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  theme(axis.line.x = element_line(size = 1))+
  scale_color_manual(name="",
                     values = c("Teplota" = "deepskyblue3", "Zmrzlina" = "indianred3"))+
  theme(legend.position = "top",legend.justification = c("left","top"))

4.2 Sklonový graf

Sklonové grafy sú vhodné na porovnávanie kategorických údajov v niekoľkých časových bodoch. Tieto grafy sú alternatívou čiarových grafov, avšak rozdiel je v tom, že obsahujú iba dva časové body (niekedy tri). Ďalším rozdielom je v to, že neobsahujú klasickú os y, namiesto nej sú údaje označené priamo. Počiatočné a koncové body každej čiary sú umiestnené na osiach na základe ich hodnoty. Zmeny v čase sú reprezentované prostredníctvom strmosti a smeru čiar. Čím ostrejší je uhol čiary, tým väčšia zmena nastala. Smer čiary popisuje, či hodnoty stúpajú alebo klesajú.

Na obrázku vľavo vidíme klasický stĺpcový graf popisujúci zmenu za obdobie desiatich rokoch v počte nezamestnaných ľudí podľa veku. Napravo vidíme tú istú situáciu, avšak znázornenú sklonovým grafom. Na základe strmosti čiary vidíme, že počet nezamestnaných vo veku 25-54 rokoch významne klesol. Rovnako vieme porovnávať medzi skupinami. V roku 2013 bol počet nezamestnaných mladých ľudí vyšší ( menej ako 25 rokov) ako počet ľudí vo veku 55 a viac. Po desiatich rokoch je to opačne.

Nez=read_excel("nezamestanost-jan-okt-vek.xlsx")


G1=ggplot(Nez,aes(Rok,Pocet))+
  geom_point(aes(color=Vek),size=2)+theme_minimal()+
  theme(panel.grid = element_blank())+
  geom_path(
    aes(group = Vek,color=Vek), 
    size = 1 ,alpha=0.7)+
  geom_text(data=.%>%filter(Rok=="2013 Október"),aes(label=Vek,color=Vek),
            vjust = 0, hjust = 1.2, size = 4,
            family="Bahnschrift") +
  geom_text(aes(x = Rok, y = Pocet, label = Pocet,color=Vek),
            vjust = -0.2, hjust = -0.3, size = 4,
             family="Bahnschrift")+
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank())+xlab("")+ylab("")+
  theme(legend.position = "none")+
  ggtitle("Počet nezamestnaných na Slovensku podľa veku")+
   theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_color_brewer(palette = "Dark2")

G2=ggplot(Nez,aes(Rok,Pocet/1000,fill=Vek))+
  geom_bar(stat = "identity",position = position_dodge2(),width=0.5)+
  theme_minimal()+xlab("")+ylab("")+
  theme(panel.grid = element_blank())+
  theme(legend.position = "top",legend.justification = c("left","top"))+
  theme(legend.title = element_blank())+
  ggtitle("Počet nezamestnaných na Slovensku podľa veku",
          subtitle = "(v tis.)")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_fill_brewer(palette = "Dark2")
grid.arrange(G2,G1,ncol=2)

4.3 Plošný graf

Plošné grafy sú čiarové grafy s vyplnenou plochou pod krivkou. Tá pridáva váhu vizualizácií zmien v čase. Čiarový graf v hornej časti obrázka a plošný graf v dolnej časti popisujú, koľko percent študentov vo veku 18 - 24 rokov predčasne ukončilo vzdelanie. Sledujú situáciu na Slovensku od roku 2013 do 2022. Možno by nás napadla otázka, prečo sme začali od y v nule, keď sme v predchádzajúcej časti povedali, že pri čiarovom grafe to tak nemusí byť. Pri plošnom grafe je vhodnejšie začať y os v nule, pretože ide akoby o stĺpec so šírkou časového obdobia.

Esl=read_excel("ESL.xlsx")

k1=Esl%>%filter(Pohlavie=="Spolu")%>%
  ggplot()+
  geom_line(aes(Rok,Percent),color="indianred2",size=1.5)+
  scale_y_continuous(breaks=c(0.0,2.5,5.0,7.5,10,12.5))+ylim(0,12.5)+
  theme_minimal()+
  scale_x_continuous(breaks=c(seq(2013,2022,1)))+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("Predčasné ukončenie vzdelania na Slovensku (vek 18-24)",
          subtitle = ("V percentách" ))
k2=k1+geom_area(aes(Rok,Percent),fill="indianred2")
grid.arrange(k1,k2)

To bola ukážka najjednoduchšieho plošného grafu. Ak máme graf s delením dát podľa nejakej kategórie, tak s ním prichádzajú aj problémy. V našom príklade môžeme dáta rozdeliť podľa pohlavia. Vidíme, že grafy sa prekrývajú. V hornej časti plošný graf zobrazujúci dáta u mužov prekrýva dáta žien, v dolnej časti je to opačne. Nevieme si jasne predstaviť, ako vyzerá situácia pod zakrytými časťami. Môže sa tam odohrávať čokoľvek, hodnoty sa môžu rovnať, rapídne klesať alebo nadobudnúť nulu. Takáto vizualizácia nemá žiadny prínos pre čitateľa, pretože graf je ťažko čitateľný. Môžeme to napraviť napríklad transparentnosťou farieb, alebo použitím jednoduchého čiarového grafu.

Dpu=read_excel("Predcasne-ukoncenie-skoly.xlsx")

Dpu$Pohlavie=factor(Dpu$Pohlavie,levels=c("Ženy","Muži"))
a=ggplot(Dpu,aes(Rok,Percent,fill=Pohlavie))+
  geom_line(aes(color=Pohlavie))+
  geom_area( position = 'identity')+
  scale_fill_manual(values=c("plum","orange2"))+
  scale_color_manual(values=c("plum","orange2"))+
  theme_minimal()+
  scale_x_continuous(breaks=c(seq(2013,2022,1)))+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("Predčasné ukončenie vzdelania na Slovensku podľa pohlavia (vek 18-24)",
          subtitle = ("V percentách" ))+
  gghighlight()
  
Dpu$Pohlavie=factor(Dpu$Pohlavie,levels=c("Muži","Ženy"))
b=ggplot(Dpu,aes(Rok,Percent,fill=Pohlavie))+
  geom_line(aes(color=Pohlavie))+
  geom_area( position = 'identity')+
  scale_fill_manual(values=c("orange2","plum"))+
  scale_color_manual(values=c("orange2","plum"))+
  theme_minimal()+
  scale_x_continuous(breaks=c(seq(2013,2022,1)))+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  gghighlight()+ggtitle("   ")
grid.arrange(a,b)

ggplot(Dpu,aes(Rok,Percent,fill=Pohlavie))+
  geom_line(aes(color=Pohlavie),size=1.5)+
  scale_color_manual(values=c("orange2","plum"))+
  theme_minimal()+
  scale_x_continuous(breaks=c(seq(2013,2022,1)))+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+ylim(5.5,10.5)+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("Predčasné ukončenie vzdelania na Slovensku podľa pohlavia (vek 18-24)",
          subtitle = ("V percentách" ))+
  gghighlight()

4.4 Ganttov graf

Iným spôsobom ako ukázať zmeny počas časového obdobia je použitie horizontálnych čiar, alebo stĺpcov reprezentujúcich trvanie. Ganttov graf sa častou používa na rozvrhnutie úloh, smien v práci, procesu projektu a pod. Na obrázku máme znázornený fiktívny proces projektu. Na osi x vidíme čas, na osi y jednotlivé úlohy, ktoré je potrebné splniť. Tento graf môžeme modifikovať do rôznych podôb. Napríklad môžeme pridaným farieb rozlíšiť, kto má danú úlohu urobiť.

plan=read_excel("plan.xlsx")
library(forcats )
plan=plan%>%mutate(StartDate = as.Date(StartDate), EndDate = as.Date(EndDate))%>%
  gather(key=datumTyp, value=datum, -úloha)
ggplot(plan) +
  geom_line(aes(x=fct_rev(fct_inorder(úloha)), y=datum), size=10,
            color="purple") +
  coord_flip()+theme_minimal()+
  scale_y_date(date_breaks = "6 day",date_labels = "%d.%b")+
  xlab("")+ylab("")+
  theme(panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank())+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("Projekt - rozvrh úloh")+
  theme(plot.title = element_text(hjust = -0.2, vjust = 1))

5 Distribúcia

V tejto kapitole sa budeme venovať grafom, ktoré zobrazujú distribúcie. Tieto grafy sú často pre čitateľa komplikované, pretože nemusia byť oboznámení so štatistickou terminológiou.Patrí tu napríklad histogram, box-plot, pyramídový graf, sviečkový graf.

5.1 Histogram

Základným grafom na vizualizáciu distribúcií je histogram. Je to špeciálny typ stĺpcového grafu, zobrazuje frekvenciu dát v jednotlivých intervaloch. Výška stĺpcov popisuje hodnotu pozorovaní dát, teda koľkokrát sa daná hodnota vyskytuje v uvedenom intervale. Histogram nám umožňuje vidieť, kde sú hodnoty koncentrované. Ľahko vieme nájsť extrémne hodnoty, medzery alebo nezvyčajné hodnoty. Hlavným kľúčom je správny výber šírky stĺpcov. Stĺpce, ktoré sú príliš široké, môžu skryť distribúciu, zatiaľčo príliš úzke stĺpce zakrývajú celkový tvar distribúcie. Neexistuje presné číslo, ktoré povie, aký počet stĺpcov zvoliť. Na obrázku máme znázornený histogram priemerného BMI u žien v krajinách sveta. Vidíme štyri grafy s rôznym počtom stĺpcov - 10,30,50,100.

BMI=read.csv("BMIw.csv")
h1=BMI%>%filter(Year==2016)%>%
  ggplot(aes(x=Mean.BMI..female.))+
  geom_histogram(bins=5,fill="#69b3a2", color="#e9ecef")+
  theme_minimal()+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_x_continuous(breaks=c(seq(20,36,2)))+
  ggtitle("Priemerné BMI u žien ",
          subtitle = ("Rok 2016" ))
h2=BMI%>%filter(Year==2016)%>%
  ggplot(aes(x=Mean.BMI..female.))+
  geom_histogram(bins=30,fill="#69b3a2", color="#e9ecef")+
  theme_minimal()+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_x_continuous(breaks=c(seq(20,36,2)))+
  ggtitle("Priemerné BMI u žien ",
          subtitle = ("Rok 2016" ))
h3=BMI%>%filter(Year==2016)%>%
  ggplot(aes(x=Mean.BMI..female.))+
  geom_histogram(bins=50,fill="#69b3a2", color="#e9ecef")+
  theme_minimal()+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_x_continuous(breaks=c(seq(20,36,2)))+
  ggtitle("Priemerné BMI u žien ",
          subtitle = ("Rok 2016" ))
h4=BMI%>%filter(Year==2016)%>%
  ggplot(aes(x=Mean.BMI..female.))+
  geom_histogram(bins=100,fill="#69b3a2", color="#e9ecef")+
  theme_minimal()+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  scale_x_continuous(breaks=c(seq(20,36,2)))+
  ggtitle("Priemerné BMI u žien ",
          subtitle = ("Rok 2016" ))
grid.arrange(h1,h2,h3,h4,ncol=2)

5.2 Boxplot

Pri zobrazovaní distribúcie našich dát, môžeme ukázať celú distribúciu alebo len jej špecifické body. John W. Tukey vytvoril box-and-whisker plot (skrátené boxplot) na ukázanie distribúcie. Základný boxplot pozostáva z obdĺžnika (box), dvoch čiar (whiskers), ktoré vychádzajú z vrchu a spodku obdĺžnika, a bodov, zobrazujúcich odľahlé hodnoty. Štandardný boxplot má 5 základných komponentov:

1. Medián určený zvislou čiarou v obdĺžniku.

2. Pravá a ľavá hrana obdĺžnika reprezentuje 1. kvartil a 3. kvartil.

3. Extrémy maximum a minimum.

4. Dve čiary spájajúce hrany s extrémnymi hodnotami.

5. Odľahlé hodnoty sú body významne vzdialené od mediánu.

Na obrázku máme boxploty priemerných hodnôt BMI u žien v šiestich krajinách. V ľavej časti sú boxploty zoradené abecedne, zatiaľ čo v pravej časti sú zoradené vzostupne podľa hodnoty mediánu. Ktoré zoradenie je správne? Odpoveď záleží na tom, čo chceme grafom povedať. Predstavme si situáciu, kde ukazujeme hodnoty BMI v 50tich krajinách, vtedy je lepšie zoradenie podľa abecedy. Graf je prehľadný a umožní nám rýchlo nájsť krajinu, napríklad Slovensko. Naopak, ak chceme upozorniť čitateľa na rozdiel v BMI medzi krajinami je lepšie použiť vzostupne usporiadanie. V našom grafe môžeme vyhodnotiť, že ženy vo Francúzsku sú priemerne chudšie ako ženy v Egypte.

B1=BMI%>%
  filter(Entity=="Slovakia"|Entity=="Hungary"|Entity=="France"|
               Entity=="Egypt"| Entity=="Brazil"| Entity=="Russia")%>%
  mutate(Entity =recode(Entity, "Slovakia" = "Slovensko"))%>%
  mutate(Entity =recode(Entity,"United States"="USA"))%>%
  mutate(Entity =recode(Entity, "China"="Čína"))%>%
  mutate(Entity=recode(Entity,"Brazil"="Brazília"))%>%
  mutate(Entity=recode(Entity,"Russia"="Rusko")) %>%
  mutate(Entity=recode(Entity,"Hungary"="Maďarsko"))%>%
  mutate(Entity=recode(Entity,"France"="Francúzsko"))%>%
  ggplot(aes(x = Entity,y=Mean.BMI..female.,group=Entity))+
  geom_boxplot(outlier.shape = NA,width=0.5,fill="#69b3a2")+
  theme_minimal()+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("Priemerné BMI u žien za obdobie 1975-2016")

B2=BMI%>%
  filter(Entity=="Slovakia"|Entity=="Hungary"|Entity=="France"|
                  Entity=="Egypt"| Entity=="Brazil"| Entity=="Russia")%>%
  mutate(Entity =recode(Entity, "Slovakia" = "Slovensko"))%>%
  mutate(Entity =recode(Entity,"United States"="USA"))%>%
  mutate(Entity =recode(Entity, "China"="Čína"))%>%
  mutate(Entity=recode(Entity,"Brazil"="Brazília"))%>%
  mutate(Entity=recode(Entity,"Russia"="Rusko")) %>%
  mutate(Entity=recode(Entity,"Hungary"="Maďarsko"))%>%
  mutate(Entity=recode(Entity,"France"="Francúzsko"))%>%
  ggplot(aes(x=reorder(Entity, Mean.BMI..female., FUN = median),
             y=Mean.BMI..female.,group=Entity))+
  geom_boxplot(outlier.shape = NA,width=0.5,fill="#69b3a2")+
  theme_minimal()+
  theme(panel.grid.major.x  = element_blank(),
        panel.grid.minor.x  = element_blank())+
  xlab("")+ylab("")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=15))+
  ggtitle("Priemerné BMI u žien za obdobie 1975-2016")
grid.arrange(B1,B2,ncol=2)

6 Vzťahy

Grafy v tejto skupine zobrazujú vzťahy a korelácie medzi dvoma alebo viacerými premennými. Pravdepodobne najznámejším grafom je bodový graf, ktorý zobrazuje každý pár hodnôt ako bod v dvojrozmernom priestore. Korelácie medzi viacerými premennými môžeme naraz zobraziť pomocou “Heat maps”. Tie využívajú maticu zafarbených buniek, ktoré reprezentujú hodnotu korelačného koeficientu medzi dvoma premennými (korelačný koeficient nadobúda hodnotu medzi -1 a 1). Farba a intenzita bunky udávajú hodnotu koeficientu, pričom farebná škála zvyčajne siaha od modrej (negatívnej) po červenú (pozitívnu). Vďaka tomuto typu grafu vieme rýchlo zistiť, medzi ktorými premennými je najslabšia alebo najsilnejšie korelácia. Variáciu heat mapy je korelačný matica, ktorá namiesto farieb obsahuje čísla - korelačné koeficienty. Korelačná matica nám dáva detailnejšie informácie o koreláciách. Avšak je ťažšia na čítanie a interpretáciu, hlavne ak obsahuje väčší počet premenných. Na vizualizáciu vzťahov medzi troma premennými sa používa bublinový graf (bubble chart). Body dostávajú tretí rozmer zmenou veľkosti bubliny na základe tretej premennej.

Existuje množstvo ďalších grafov ako zobraziť vzťahy: graf s rovnobežnými súradnicami (parallel coordinates plot), radarový diagram, stromový diagram. V tejto časti si ukážeme príklady bodového a bublinového grafu.

6.1 Bodový graf

Ako sme v predošlom odseku poznamenali, bodový graf ilustruje koreláciu medzi dvoma premennými - jedna premenná je zobrazená na osi x a druhá na osi y. Osi v bodovom grafe nemusia začínať nulou, najmä ak hodnota nula nie je možnou hodnotou. Napríklad, ak pozorujeme výkon a spotrebu áut, nemá zmysel uvažovať o nulovom výkone alebo o nulovej spotrebe. Častokrát sa stretneme s bodmi ktoré sa prekrývajú. Tento problém môžeme vyriešiť efektom transparentnosti bodov. Bodový graf pomáha čitateľovi zistiť, či sú dve premenné medzi sebou asociované. Ak body smerujú v jednom smere- doprava pozdĺž horizontálnej osi a hore pozdĺž vertikálnej osi-hovoríme o pozitívnej korelácií. Inak povedané, ak sa jedna premenná zvyšuje tak sa aj druhá premenná zvyšuje. V opačnom prípade hovoríme o negatívnej korelácií. Môže nastať aj situácia, že medzi premennými nie je žiaden vzťah, vtedy povieme, že nie sú korelované. Jedným zo spôsobom ako môžeme ukázať koreláciu jasnejšie, je pridanie čiary, nazývanej regresná priamka.

Na grafe máme zobrazený výkon a spotrebu 156 áut. Každé auto je reprezentované bodom. Ako sme spomenuli body sa prekrývajú, použili sme priehľadnosť bodov. Vo vrchnej časti máme graf aj s regresnou priamkou. Určite sme si všimli dva body, ktoré sú zaujímavé. Jeden bod reprezentuje auto s vysokým výkonom a najvyššou spotrebou. Druhý bod má vysoký výkon ale nízku spotrebu. Možno by sme chceli vedieť o aké autá ide. To sme čitateľovi umožnili v spodnom grafe pridaním názvov áut. Máme veľa možnosti ako graf upraviť, musíme len zhodnotiť na čo chceme čitateľa upútať.

auta=read_excel("auta.xlsx")
a1=ggplot(auta,aes(x=Výkon,y=Spotreba,label=Model))+
  geom_point(size=2.5,color="dodgerblue3",shape=19,alpha = 0.7)+
  theme_minimal()+
  xlab("Výkon v konských silách")+ylab("Spotreba l/100 km")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Výkon a spotreba áut ")+
  theme(axis.title.x = element_text(size = 13))+
  theme(axis.title.y = element_text(size=13))+
  theme(axis.line.x = element_line(size = 0.5),
        axis.line.y = element_line(size = 0.5))+
  geom_smooth(method = "lm", se = FALSE,color="black",size=0.5)

a2=ggplot(auta,aes(x=Výkon,y=Spotreba,label=Model))+
  geom_point(size=2.5,color="dodgerblue3",shape=19,alpha = 0.7)+
  geom_text(aes(label=ifelse(Spotreba>9,as.character(Model),'')),
            hjust=1.05,vjust=0.3,family="Bahnschrift")+
  geom_text(aes(label=ifelse(Spotreba<3&Výkon>400,as.character(Model),'')),
            hjust=1.05,vjust=0.3,family="Bahnschrift")+
  theme_minimal()+
  xlab("Výkon v konských silách")+ylab("Spotreba l/100 km")+
  theme(plot.title = element_text(size=18),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Výkon a spotreba áut ")+
  theme(axis.title.x = element_text(size = 13))+
  theme(axis.title.y = element_text(size=13))+
  theme(axis.line.x = element_line(size = 0.5),
        axis.line.y = element_line(size = 0.5))

grid.arrange(a1,a2,ncol=1)

6.2 Bublinový graf

Bublinový graf vzniká z bodového grafu pridaním tretieho rozmeru-zmenou veľkosti kruhov podľa tretej premennej. Body v grafe nemusia byť striktne kruhy, môžeme zvoliť aj iný tvar. Avšak pamätajme na to, že niektoré tvary môžu deformovať vnímame našich dát. Ďalej poznamenajme, že hodnota tretej premennej by mala byť odlíšená na základe obsahu bublín, nie podľa polomeru. Farbou vieme zoskupiť alebo zvýrazniť určité body alebo priamo upozorniť čitateľa na odlišné časti grafu. Pretože tento typ grafu je viac neznámy, musíme dbať na to, ako označenia a anotácie môžu čitateľovi uľahčiť porozumenie grafu.

Na obrázku máme znázornený štandardný bublinový graf. V grafe sledujeme tri premenné-očakávanú dĺžku života, úmrtnosť, a veľkosť populácie v tridsiatich krajinách Európy. Údaje máme za rok 2020. Ako sme si povedali niekoľkokrát, tretia premenná je znázornená veľkosťou bubliny. Vďaka tomu vieme vysloviť záver, že krajina s najväčšou populáciou má najvyššiu úmrtnosť a očakávaná dĺžka života v tejto krajine je približne 81 rokov.

DUP=read_excel("DUP-EU.xlsx")

ggplot(DUP, aes(x=Dlzka, y=Umrtnost, size = Pop,label=Krajina)) +
  geom_point(alpha=0.7,color="indianred")+
  scale_size(range = c(5, 18), name="Populácia (M)")+
  theme_minimal()+xlab("Očakávaná dĺžka života")+
  ylab(" ")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Očakávaná dĺžka života a úmrtnosť (krajiny EÚ, rok 2020) ",
          subtitle = "(Veľkosť bublín reprezentuje populáciu)")+
  theme(axis.title.x = element_text(size = 13))+
  theme(axis.title.y = element_text(size=13))+
  theme(axis.line.x = element_line(size = 0.5),
        axis.line.y = element_line(size = 0.5))+
  theme(legend.position = "none")+  
  scale_y_continuous(labels = label_number(suffix = " tisíc", 
                                           scale = 1e-3),
                     limits = c(0,200000))

Rovnako ako každý graf vieme obmieňať. Vyššie sme opísali jeden bod, stále však nevieme, akú konkrétnu krajinu reprezentuje. V grafe sme pridali názov krajiny. Teraz už vieme povedať, že krajina s najvyššou úmrtnosťou je Nemecko. Rovnako sme zvýraznili bod, ktorý reprezentuje najvyššiu očakávanú dĺžku života-Nórsko. Ďalej sme pridali farbu, ktorá odlišuje časti Európy. Teraz každý bod je popísaný štyrmi údajmi: hodnota veku, číslo úmrtnosti, veľkosť populácie v krajine, príslušnosť krajiny do nejakej časti Európy. Častokrát sa môžeme stretnúť s bodovým grafom, v ktorom je každý bod pomenovaný (v našom príklade by to bol názov krajiny pre každý bod). Výsledkom je preplnený a nečitateľný graf.

library(ggrepel)  
u1=ggplot(DUP, aes(x=Dlzka, y=Umrtnost, size = Pop,label=Krajina))+
  geom_point(alpha=0.7,color="indianred")+
  scale_size(range = c(5, 18), name="Populácia (M)")+
  theme_minimal()+xlab("Očakávaná dĺžka života")+
  ylab(" ")+
  geom_text_repel(aes(label=ifelse(Dlzka==max(Dlzka),as.character(Krajina),'')),
     hjust=0.3,vjust=0.3,family="Bahnschrift",size=4)+
  geom_text_repel(aes(label=ifelse(Umrtnost==max(Umrtnost),as.character(Krajina),'')),           hjust=0.6,vjust=1.5,family="Bahnschrift",size=4)+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Očakávaná dĺžka života a úmrtnosť (krajiny EÚ, rok 2020) ",
          subtitle = "(Veľkosť bublín reprezentuje populáciu)")+
  theme(axis.title.x = element_text(size = 13))+
  theme(axis.title.y = element_text(size=13))+
  theme(axis.line.x = element_line(size = 0.5),
        axis.line.y = element_line(size = 0.5))+
  theme(legend.position = "none")+  
  scale_y_continuous(labels = label_number(suffix = " tisíc", 
                                           scale = 1e-3),
                     limits = c(0,200000))

u2=ggplot(DUP, aes(x=Dlzka, y=Umrtnost, size = Pop,label=Krajina)) +
  geom_point(alpha=0.7,aes(color=Cast))+
  scale_size(range = c(5, 18), name="Populácia (M)")+
  theme_minimal()+xlab("Očakávaná dĺžka života")+
  ylab(" ")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Očakávaná dĺžka života a úmrtnosť (krajiny EÚ, rok 2020) ",
          subtitle = "(Veľkosť bublín reprezentuje populáciu)")+
  theme(axis.title.x = element_text(size = 13))+
  theme(axis.title.y = element_text(size=13))+
  theme(axis.line.x = element_line(size = 0.5),
        axis.line.y = element_line(size = 0.5))+
  scale_y_continuous(labels = label_number(suffix = " tisíc", 
                                           scale = 1e-3),
                     limits = c(0,200000))+
  guides(size = FALSE)+
  theme(legend.position = "top", legend.title = element_blank())+
  guides(color = guide_legend(override.aes = list(size=5)))
grid.arrange(u1,u2,ncol=1)

7 Celok na časti

Táto trieda grafov zobrazuje, ako je celok rozložený na časti. Spomenuli sme už skladaný stĺpcový graf, ktorý môžeme zaradiť aj do tejto skupiny grafov. Najpopulárnejším a najviac známym grafom je koláčový graf. Neskôr si o tomto grafe povieme viac. Na rozdelenie celku môžeme použiť aj menej známe grafy, a to: mozaikový graf a wafflový graf. Wafflový graf je zložený z 10x10 štvorcov, kde každý zafarbený štvorec reprezentuje jedno percento. Môžme použiť rôzne ikony namiesto štvorčekov. Avšak musíme dbať na to aby boli vhodné, neurážať. Zlým príkladom je použitie ikony mužskej postavy na reprezentovanie počtu obyvateľov, mohlo by to pôsobiť ako ignorancia žien. Mozaikový graf pochádza zo stĺpcového grafu rozšírením základne obdĺžnika, a ukazuje tak ďalšiu hodnotu premennej. Na obrázku vidíme jednoduché príklady. Naľavo máme znázornené tragédiu Titanicu , napravo máme zastúpenie zamestnancov vo firme podľa veku (fiktívne dáta).

library(ggmosaic)
data(titanic)
m=titanic%>%
  mutate(Survived =recode(Survived, "Yes" = "Áno"))%>%
  mutate(Survived =recode(Survived, "No" = "Nie"))%>%
  mutate(Class =recode(Class, "1st" = "1."))%>%
  mutate(Class =recode(Class, "2nd" = "2."))%>%
  mutate(Class =recode(Class, "3rd" = "3."))%>%
  mutate(Class =recode(Class, "Crew" = "Personál"))%>%
  ggplot() +
  geom_mosaic(aes(x = product(Class), fill = Survived)) + 
  theme_minimal() +
  scale_fill_brewer(palette = "Set1") + 
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  theme(legend.position = "none")+
  ggtitle("Väčšia časť personálu neprežila haváriu Titanicu",
          subtitle = "Mozaikový graf")+
  xlab("Trieda")+ylab("Prežitie")+
  theme(panel.grid = element_blank())

library(waffle)

df <- data.frame(vek = c("20-30 ","31-40","41-50"),
                 pocet = c(25,60,15))
w=ggplot(df, aes(fill = vek, values = pocet)) +
  geom_waffle(n_rows = 10, colour = "white")+
  scale_fill_manual(name = NULL,
                    values = c("forestgreen", "green2", "lightgreen"),
                    labels = c("20-30","31-40","41-50")) +
  
  ggtitle("Zamestnanci vo firme podľa veku",
          subtitle = "Wafflový graf")+
  theme_void()+ theme(legend.position = "top")+
  coord_equal() +
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))
grid.arrange(m,w,ncol=2)

7.1 Koláčový graf

Koláčový graf vyjadruje vzťah časti k celku vo vašich údajoch. Predstavme si skutočný koláč (kruh). Každý plátok predstavuje jednu časť a všetky plátky spolu vytvárajú celok. Máme radi, keď sú veci celistvé a chápeme, ako jednotlivé časti súvisia s celkom. Každý kúsok koláča (kruhový výsek), vieme popísať troma vizuálnymi komponentami: stredový uhol, obsah, dĺžka kruhového oblúka. Ľudský mozog číta koláčový graf porovnávaním obsahu častí. Koláčový graf je dobré použiť v dvoch prípadoch.

  1. Ak chceme aby publikum videlo vzťahy častí k celku, ale presná hodnota je menej podstatná.
  2. Ak chceme poukázať, nejaký element je relatívne malý alebo veľký k ostatným elementom.

Hlavným pravidlom pre koláčový graf je, že časti spolu musia tvoriť 100 percent alebo sa sčítať na celkový počet. Nemôžeme vynechať nejakú časť, alebo naopak nesmú časti presiahnuť 100 percent. Časti by sme mali zoradiť od najväčšej po najmenšiu v smere hodinových ručičiek, pričom najväčšia časť by mala začínať na pozícií 12 hodín. Avšak toto usporiadané nemusí byť prirodzené v každej situácií. Predstavme si koláčový graf, ktorého časti reprezentujú určitú vekovú skupinu. Je prirodzené skupiny zoradiť od “najmladšej”.

Na obrázku máme jednoduché koláčové grafy (hodnoty sme prispôsobili tak, aby sme vedeli ľahko ukázať potrebné), v ktorých časti sú zoradené od najväčšej po najmenšiu. Graf naľavo začína na pozícií 12 hodín, graf napravo je otočený.

pie <- data.frame(Skupina=c("A","B","C","D","E"),
                  Hodnota=c(20,44,60,70,6))

pie1=pie %>% 
  mutate(csum = rev(cumsum(rev(Hodnota))), 
         pos = Hodnota/2 + lead(csum, 1),
         pos = if_else(is.na(pos), Hodnota/2, pos))
pie1=pie1%>%
  mutate(Label=paste(Skupina, 
                     paste(round(((Hodnota/sum(Hodnota))*100),1),"%"), 
                     sep=" "))%>%
  mutate(Label2=paste(Skupina, 
                      paste(Hodnota,"ks"), 
                      sep=" "))
p2=ggplot(pie1, aes(x = "", y = Hodnota,fill=reorder(Skupina,Hodnota))) +
  geom_col(width = 1, color = "white") +
  scale_fill_manual(values = c("A" = "#1B9E77",
                               "B" = "#D95F02",
                               "C"="#7570B3",
                               "D"="#E7298A",
                               "E"="#66A61E"))+
  scale_color_manual(values = c("A" = "#1B9E77",
                                "B" = "#D95F02",
                                "C"="#7570B3",
                                "D"="#E7298A",
                                "E"="#66A61E"))+
  coord_polar(theta = "y") +
  geom_label(
    aes(y = pos, label =Label,color=Skupina),
    size =8, nudge_x = 1, show.legend = FALSE,fill="white",
    label.size = NA,
    family="Bahnschrift") +
  theme_void()+
  theme(legend.position = "none")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Koláčový graf - vhodný začiatok")

p3=ggplot(pie1, aes(x = "", y = Hodnota,fill=reorder(Skupina,Hodnota))) +
  geom_col(width = 1, color = "white") +
  scale_fill_manual(values = c("A" = "#1B9E77",
                               "B" = "#D95F02",
                               "C"="#7570B3",
                               "D"="#E7298A",
                               "E"="#66A61E"))+
  scale_color_manual(values = c("A" = "#1B9E77",
                                "B" = "#D95F02",
                                "C"="#7570B3",
                                "D"="#E7298A",
                                "E"="#66A61E"))+
  coord_polar(theta = "y",start=90) +
  geom_label(
    aes(y = pos, label =Label,color=Skupina),
    size =8, nudge_x = 1, show.legend = FALSE,fill="white",
    label.size = NA,
    family="Bahnschrift") +
  theme_void()+
  theme(legend.position = "none")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  ggtitle("Koláčový graf - nevhodný začiatok ")
grid.arrange(p2,p3,ncol=2)

Na nasledujúcom obrázku máme znázornené rovnaké údaje, ale sú zoradené odlišne. Vo verzii naľavo nie je ihneď jasná veľkosť skupiny B. Na pravo sme rotáciou zabezpečili, že čitateľ okamžite uvidí v strede pravý uhol, teda skupina B tvorí 25 percent z celku. Koláčový graf je vhodné použiť, ak nejaká časť tvorí 25, 50, 75 percent z celku.

pie2 <- data.frame(Skupina=c("A","B","C","D","E"),
                  Hodnota=c(40,25,14,11,10))

s2=ggplot(pie2, aes(x = "", y = Hodnota,fill=reorder(Skupina,Hodnota))) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y",start=50.9) +
  scale_fill_brewer(palette = "Dark2") +
  theme_void()+
  theme(legend.position = "none")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  geom_text(aes(label = Skupina),
            position = position_stack(vjust = 0.5),family="Bahnschrift",
            color="white",size=6)
s1=ggplot(pie2, aes(x = "", y = Hodnota,fill=reorder(Skupina,Hodnota))) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_brewer(palette = "Dark2") +
  theme_void()+
  theme(legend.position = "none")+
  theme(plot.title = element_text(size=18),
        plot.subtitle = element_text(size=12),
        text = element_text(family = "Bahnschrift",size=16))+
  geom_text(aes(label = Skupina),
            position = position_stack(vjust = 0.5),family="Bahnschrift",
            color="white",size=6)
grid.arrange(s1,s2,ncol=2)  

Tieto hodnoty sú známe pre všetkých, už v škole sme sa naučili vyznačiť polovicu kruhu, štvrtinu, a pod. Vytvoriť správny koláčový graf je náročné, pre dobrú vizualizácia by sme mali dodržiavať nasledovné: Ako sme už spomenuli nikdy nepoužívajme 3D efekt. Vyhnime sa príliš veľkému počtu častí}. V prípade, že máme príliš veľa malých časti, ktoré sú tenké, spojme ich do kategórie “ostatné”. Odstaňme legendu a označme údaje priamo. Zvoľme farby strategicky. Farba je pravdepodobne najdôležitejším rozhodnutím, ktoré robíme, aby sme zamerali pozornosť nášho publika.

8 Záver

V dnešnej dobe sa často stretávame s vizualizáciou dát vo všetkých možných formách, či už ide o grafy na webových stránkach, prezentácie v práci alebo štatistiky v novinách. Verím, že táto online publikácia vám poskytla užitočný prehľad o princípoch vizualizácie dát a pomohla vám lepšie porozumieť tomuto dôležitému aspektu analytického procesu. Dúfam, že si z nej odnášate nielen nové poznatky, ale aj praktické zručnosti, ktoré budete môcť využiť vo svojej práci či v osobnom živote. Ďakujem vám za záujem a teším sa, že ste sa rozhodli preskúmať vizualizácie dát spolu so mnou.