Yau (2013) menjelaskan bahwa unsur dalam visualisasi data dapat diuraikan sebagai berikuti ini.

Visual Cue

Colors

Ilustrasi berikut ini akan menggunakan data CIACountries yang tersedia di package mdsr. Silahkan menginstall package tersebut terlebih dulu.

library(mdsr)
library(tidyverse)
data("CIACountries")
glimpse(CIACountries)
## Rows: 236
## Columns: 8
## $ country   <chr> "Afghanistan", "Albania", "Algeria", "American Samoa", "Ando~
## $ pop       <dbl> 32564342, 3029278, 39542166, 54343, 85580, 19625353, 16418, ~
## $ area      <dbl> 652230, 28748, 2381741, 199, 468, 1246700, 91, 443, 2780400,~
## $ oil_prod  <dbl> 0, 20510, 1420000, 0, NA, 1742000, NA, 0, 532100, 0, 0, 3543~
## $ gdp       <dbl> 1900, 11900, 14500, 13000, 37200, 7300, 12200, 23600, 22600,~
## $ educ      <dbl> NA, 3.3, 4.3, NA, NA, 3.5, 2.8, 2.4, 6.3, 3.3, 6.0, 5.6, 5.9~
## $ roadways  <dbl> 0.06462444, 0.62613051, 0.04771929, 1.21105528, 0.68376068, ~
## $ net_users <fct> >5%, >35%, >15%, NA, >60%, >15%, >15%, >60%, >35%, >35%, >60~

Data CIACountries terdiri dari 236 pengamatan dan 8 peubah, untuk melihat detil deskripsi data dapat digunakan fungsi help(), atau dengan membuka link berikut ini: https://www.rdocumentation.org/packages/mdsr/versions/0.2.4/topics/CIACountries

help(CIACountries)

Pertama, seandainya kita ingin menginvestigasi hubungan antara peubah educ (education spending (% of GDP) ) dengan gdp (Gross Domestic Product per capita ($/person)) tanpa memperhatikan informasi lain.

library(ggplot2)
g <- ggplot(data = CIACountries, aes(y = gdp, x = educ))
g + geom_point(size = 3)

Apabila diperhatikan pula berdasarkan peubah net_users (fraction of internet users (% of population)), ternyata negara dengan fraksi pengguna internet di atas 60% cenderung memiliki rata-rata GDP yg lebih tinggi, serta korelasi yang lebih tinggi antara gdp dan educ.

g + geom_point(aes(color = net_users), size = 3)

Scale

Scale dapat pula dimanfaatkan untuk menambah informasi, apabila dianggap relevan.

g + geom_point(aes(color = net_users, size = roadways))

Transformasi juga dapat dilakukan untuk memudahkan dalam melihat pola hubungan.

g + geom_point(aes(color = net_users, size = roadways)) +
coord_trans(y = "log10")

g + geom_point(aes(color = net_users, size = roadways)) +
scale_y_continuous(name = "Gross Domestic Product", trans = "log10")

Layers & Facets

g2 <- ggplot(data = SAT_2010, aes(x = expenditure, y = math)) + geom_point()
g2 <- g2 + geom_smooth(method = "lm", se = 0) +
xlab("Average expenditure per student ($1000)") +
ylab("Average score on math SAT")
SAT_2010 <- SAT_2010 %>%
mutate(SAT_rate = cut(sat_pct, breaks = c(0,30,60,100),
labels = c("low", "medium", "high")))
g2 <- g2 %+% SAT_2010
g2 + aes(color = SAT_rate)

library(NHANES)
ggplot(data = sample_n(NHANES, size = 1000),
aes(x = Age, y = Height, color = Gender)) +
geom_point() + geom_smooth() + xlab("Age (years)") + ylab("Height (cm)")

g + geom_point(alpha = 0.9, aes(size = roadways)) + coord_trans(y="log10") +
facet_wrap(~net_users, nrow = 1) + theme(legend.position = "top")

Position

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, colour = cut))

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = cut))

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity))

ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) + 
  geom_bar(alpha = 1/5, position = "identity")

ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) + 
  geom_bar(fill = NA, position = "identity")

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy))

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy), position = "jitter")

Coordinate System

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot()

ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot() +
  coord_flip()

nz <- map_data("nz")

ggplot(nz, aes(long, lat, group = group)) +
  geom_polygon(fill = "white", colour = "black")

ggplot(nz, aes(long, lat, group = group)) +
  geom_polygon(fill = "white", colour = "black") +
  coord_quickmap()

bar <- ggplot(data = diamonds) + 
  geom_bar(
    mapping = aes(x = cut, fill = cut), 
    show.legend = FALSE,
    width = 1
  ) + 
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL)

bar + coord_flip()

bar + coord_polar()

Illustration: Historical baby names

Berikut ini adalah contoh yang dirujuk dari Baumer et al. (2017). Data yang akan digunakan dapat diakses pada package babynames. Pada kasus ini kita akan menggunakan fungsi make_babynames_dist() untuk mengakses data babynames dengan menambahkan kolom estimasi banyaknya orang yang hidup pada tahun 2014.

library(babynames)
BabynamesDist <-make_babynames_dist()
head(BabynamesDist, 2)
## # A tibble: 2 x 9
##    year sex   name      n   prop alive_prob count_thousands age_today
##   <dbl> <chr> <chr> <int>  <dbl>      <dbl>           <dbl>     <dbl>
## 1  1900 F     Mary  16706 0.0526          0           16.7        114
## 2  1900 F     Helen  6343 0.0200          0            6.34       114
## # ... with 1 more variable: est_alive_today <dbl>

Seandainya kita ingin menampilkan informasi tentang banyaknya orang bernama Josephs yang lahir setiap tahunnya, serta banyaknya di antara mereka yang diharapkan masih hidup.

joseph <- BabynamesDist %>%
filter(name == "Joseph" & sex == "M")
name_plot <- ggplot(data = joseph, aes(x = year))

Pertama, kita menambahkan histogram dari data banyaknya orang bernama Joseph yang diharapkan masih hidup. Berdasarkan tahun kelahirannya.

name_plot <- name_plot +
geom_bar(stat = "identity", aes(y = count_thousands * alive_prob),
fill = "#b2d7e9", colour = "white")
name_plot

Selanjutnya, kita menambahkan kurva yang menggambarkan banyaknya orang bernama Joseph yang lahir pada setiap tahun yang diamati.

name_plot <- name_plot + geom_line(aes(y = count_thousands), size = 2)
name_plot <- name_plot +
ylab("Number of People (thousands)") + xlab(NULL)
name_plot

Kita dapat menggunakan fungsi summary() untuk memastikan apakah fungsi yang digunakan sudah tepat untuk menjawab pertanyaan yang diteliti.

summary(name_plot)
## data: year, sex, name, n, prop, alive_prob, count_thousands, age_today,
##   est_alive_today [111x9]
## mapping:  x = ~year
## faceting: <ggproto object: Class FacetNull, Facet, gg>
##     compute_layout: function
##     draw_back: function
##     draw_front: function
##     draw_labels: function
##     draw_panels: function
##     finish_data: function
##     init_scales: function
##     map_data: function
##     params: list
##     setup_data: function
##     setup_params: function
##     shrink: TRUE
##     train_scales: function
##     vars: function
##     super:  <ggproto object: Class FacetNull, Facet, gg>
## -----------------------------------
## mapping: y = ~count_thousands * alive_prob 
## geom_bar: width = NULL, na.rm = FALSE, orientation = NA
## stat_identity: na.rm = FALSE
## position_stack 
## 
## mapping: y = ~count_thousands 
## geom_line: na.rm = FALSE, orientation = NA
## stat_identity: na.rm = FALSE
## position_identity

Kita dapat menambahkan informasi median dari tahun kelahiran dengan menjalankan code berikut.

#install.packages("Hmisc")
wtd.quantile <- Hmisc::wtd.quantile
median_yob <-
with(joseph, wtd.quantile(year, est_alive_today, probs = 0.5))
median_yob
##  50% 
## 1975
name_plot <- name_plot +
geom_bar(stat = "identity", colour = "white", fill = "#008fd5",
aes(y = ifelse(year == median_yob, est_alive_today / 1000, 0)))

Terakhir, tambahan informasi berupa teks yang dapat membantu pembaca memahami grafik yang disajikan.

name_plot +
ggtitle("Age Distribution of American Boys Named Joseph") +
geom_text(x = 1935, y = 40, label = "Number of Josephs\nborn each year") +
  geom_text(x = 1915, y = 13, label =
"Number of Josephs\nborn each year\nestimated to be alive\non 1/1/2014",
colour = "#b2d7e9") +
geom_text(x = 2003, y = 40,
label = "The median\nliving Joseph\nis 37 years old",
colour = "darkgray") +
geom_curve(x = 1995, xend = 1974, y = 40, yend = 24,
arrow = arrow(length = unit(0.3,"cm")), curvature = 0.5) + ylim(0, 42)

References

Baumer, B. S., Kaplan, D. T., & Horton, N. J. (2017). Modern data science with R. CRC Press.

Wickham, H., & Grolemund, G. (2016). R for data science: import, tidy, transform, visualize, and model data. " O’Reilly Media, Inc.".

Yau, N. (2013). Data points: visualization that means something. John Wiley & Sons.