STWURek #2: ggplot - drugie starcie

Drugi STWURek został przygotowany przez członków Koła Naukowego Statystyki Matematycznej Gauss: Paulinę Krzysztoporską, Marcina Koralewskiego i Bartosza Pawliczaka.

Typy prezentacji danych

Podstawowe 4 typy prezentacji danych:

  • Porównanie
  • Kompozycja
  • Rozkład
  • Relacje między danymi

Pytania, które warto sobie zadać:

  • Jak dużo zmiennych chcemy pokazać na jednym wykresie?
  • Jak wiele punktów danych pokażemy?
  • Czy dane są zmienne w czasie? A może zmieniają się w zależności od grup?

Czy zawsze potrzebujemy wykresu?

Tabela dobrze prezentuje dane, gdy

  • chcemy znaleźć i porównać pojedyncze wartości,
  • pokazujemy dokładne wartości,
  • mamy do czynienia z różnymi jednostkami,
  • pokazujemy ilościowe informacje, a nie trend.

Wykres będzie odpowiedni, gdy

  • będzie przekazywał wiadomość poprzez kształt,
  • chcemy pokazać relacje między wieloma zmiennymi.

Wykres punktowy (scatter plot)

plot of chunk myplot

Wykres kołowy (pie chart)

Wykres słupkowy (bar plot)

  • w pozycji horyzontalnej najlepiej obrazuje 5,7 zmiennych,
  • jeśli zmienną jest czas, umieszczamy ją na osi x,
  • osie startują z zera!

Wykres słupkowy (bar plot)

daneNaSzybko <- read.csv("edu_dat.csv", encoding="UTF-8")
Wyksztalcenie<-as.numeric(daneNaSzybko$edukacja!="wyższe i policealne")
ggplot(daneNaSzybko,aes(Wyksztalcenie,fill=wojewodztwo))+
  geom_bar(position="stack")+xlab(expression(bold("W. wyższe/policealne a pozostałe")))+
  theme_classic()+ylab("")

plot of chunk bartosz_code_1

ggplot(daneNaSzybko,aes(Wyksztalcenie,fill=wojewodztwo))+
  geom_bar(position="fill")+xlab(expression(bold("W. wyższe/policealne a pozostałe")))+
  theme_classic()+ylab("")

plot of chunk bartosz_code_1

wykres<-ggplot(spotkan, aes(x = plec, y = waga, fill = psycholog)) + 
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ rok, ncol = 1)
wykres+ggtitle(expression(atop("Wizyty u psychologa", 
                               atop(italic("Dane z Diagnozy Społecznej"), ""))))+standard_bp+labs(y="")

plot of chunk bartosz_code_3

wykres<-ggplot(spotkan2, aes(x = plec, y = waga, fill = TV)) + 
  geom_bar(stat = "identity", position = "dodge") + coord_polar() +
  facet_wrap(~ rok, ncol = 1)
wykres+ggtitle(expression(atop("Częstość oglądania TV", 
                               atop(italic("Dane z Diagnozy Społecznej"), ""))))+standard_bp+labs(y="")

plot of chunk bartosz_code_4

Wykres liniowy (line plot)

  • Używany najczęściej wtedy, kiedy chcemy pokazać zmienność cechy w czasie.
  • Bardzo podatny na zmniejszenie czytelności przez dużą liczbę cech
temp = osoby %>%
  select(ap83_1, wojewodztwo, podregion58, eduk4_2000, waga_2000_ind) %>%
  mutate_each(funs(as_factor), -waga_2000_ind) %>% 
  group_by(ap83_1, eduk4_2000, podregion58, wojewodztwo) %>% 
  summarise(waga = sum(waga_2000_ind, na.rm = TRUE), rok = 2000) %>% 
  filter(!is.na(ap83_1)) %>%
  filter(!is.na(eduk4_2000)) %>%
  rename(czy_pali = ap83_1, wyksztalcenie = eduk4_2000) 
temp$rok = 2000
### (...)
palenie = rbind(temp, temp2, temp3, temp4, temp5, temp6, temp7, temp8) 
#### more factors
palenie_a_podregion_region_wyksztalcenie_i_rok = palenie %>%
  select(czy_pali, wyksztalcenie, podregion58, wojewodztwo, rok, waga) %>%
  mutate_each(funs(as.factor), -waga) 

# change values to numeric
palenie_a_podregion_region_wyksztalcenie_i_rok$czy_pali = gsub(
  'TAK',1,palenie_a_podregion_region_wyksztalcenie_i_rok$czy_pali)
palenie_a_podregion_region_wyksztalcenie_i_rok$czy_pali = gsub(
  'NIE',0,palenie_a_podregion_region_wyksztalcenie_i_rok$czy_pali)
palenie_a_podregion_region_wyksztalcenie_i_rok$czy_pali = as.numeric(
  palenie_a_podregion_region_wyksztalcenie_i_rok$czy_pali)
#group, count percent
palenie_a_wyksztalcenie_i_rok = palenie_a_podregion_region_wyksztalcenie_i_rok %>% 
  filter(!is.na(wyksztalcenie)) %>%
  group_by(wyksztalcenie, rok) %>% 
  summarise(percent = sum(czy_pali*waga)/sum(waga)) 

# change to datetime object
palenie_a_wyksztalcenie_i_rok$rok <- strptime(
  x = as.character(palenie_a_wyksztalcenie_i_rok$rok), format="%Y")
#First plot
ggplot(data=palenie_a_wyksztalcenie_i_rok, aes(
  x=rok, y=percent, group=wyksztalcenie, color=wyksztalcenie))+
  geom_line(stat = "identity")+
  scale_colour_brewer(type='seq', palette = 'OrRd')+
  scale_x_datetime(date_labels = "%Y", date_breaks = '2 years')+
  ggtitle('Procent palących na przestrzeni lat')+
  ylab('Procent palących')+
  xlab('Rok badania')

Pierwszy geom_line:

plot of chunk marcin_plot_1

W wykresie powyżej nie pasuje nam bardzo wiele rzeczy :)

  • niska czytelność
  • mało czytelna skala osi Y
  • chcemy czytelnika poinformować o niepewności wynikającej z trendu
  • tytuł bardzo źle wygląda
# 2gi wykres
ggplot(data=palenie_a_wyksztalcenie_i_rok, aes(
  x=rok, y=percent, group=wyksztalcenie, color=wyksztalcenie))+
  geom_line(stat = "identity")+
  scale_colour_brewer(type='seq', palette = 'OrRd')+
  scale_x_datetime(date_labels = "%Y", date_breaks = '2 years')+
  ylab('Procent palących')+
  xlab('Rok badania')+ ###############################
  geom_smooth(method='loess')+
  scale_y_continuous(labels = scales::percent)+
  theme_dark()+
  ggtitle(expression(atop("Procent palących na przestrzeni lat", atop(
    italic("Dane z Diagnozy Społecznej"), "")))) +
  theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1), 
        plot.title = element_text(size = 25, face = "bold", colour = "black", vjust = -1))

plot of chunk marcin_plot_2 Na tą chwilę można dopracować:

  • podpisy osi
  • legenda jest mało czytelna
  • tytuł
ggplot(data=palenie_a_wyksztalcenie_i_rok, aes(
  x=rok, y=percent, group=wyksztalcenie, color=wyksztalcenie))+
  geom_line(stat = "identity")+
  scale_colour_brewer(type='seq', palette = 'OrRd')+
  scale_x_datetime(date_labels = "%Y", date_breaks = '2 years')+
  geom_smooth(method='loess')+
  scale_y_continuous(labels = scales::percent)+
  theme_dark()+
  ggtitle(expression(atop("Procent palących na przestrzeni lat",
                          atop(italic("Dane z Diagnozy Społecznej"), "")))) +
  theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1), 
        plot.title = element_text(size = 25, face = "bold", 
                                  colour = "black", vjust = -1, hjust=0.5))+############
  theme(legend.direction = 'vertical',
        legend.key.size = unit(3, 'lines'), legend.justification = c(1, -0.015), 
        legend.title = element_text(size = 18, colour = "black", vjust = 0),
        legend.text = element_text(size = 11),
        axis.title.x = element_text(size = 15, colour = 'grey35'),
        axis.title.y = element_text(size = 15, colour = 'grey35'),
        plot.background = element_rect(fill = 'grey90'),
        legend.background = element_rect(fill = 'grey90')) +
        labs(x = 'Rok badania', y = 'Procent palących', color='Wykształcenie')

plot of chunk marcin_plot_3