Module 3-1-Principle - Data Visualization with ggplot2 in R
1 Overview
1.1 Expected Learning Outcomes
After taking this workshop, participants should be able to do following:
- Explain the concepts of the grammar of graphics when visualizing data with ggplot2 package.
- Be familiar with various types of charts.
- Visualize data in counts and proportions.
- Select appropiate charts based on straight consideration (e.g, the characteristics of the data and audience)
- Create a chart that involves one or two variables with either categorial or continuos data.
- Create a chart by adding categorical moderator (3rd variable) to the chart involving two or three variables. 7.Create correlation charts. Read charts and generate insights. Describe three popular packages that allow one to visualize data. Explain the concept of the grammar of graphics when visualizing data with the ggplot2 package. #install.packages(“ggplot2”) #install.packages(‘ggrepel’) #install.packages(‘ggthemes’) #install.packages(‘scales’) #install.packages(‘plotly’) #install.packages(‘lattice’) #install.packages(‘GGally’) #install.packages(“dplyr”) #install.packages(“tidyverse”) #install.packages(‘ggtext’) #install.packages(“glue”) library(ggplot2) #visualization library(ggrepel) #labels for data library(ggthemes) #collections of themes library(scales) # scale library(plotly) # interactive chart library(GGally) # correlation library(dplyr) # data transformation library(tidyverse) # mega package containing 8 packages library(ggtext) # for text visualization library(glue) # combining multiple component library(gapminder)
2 1. Understand mtcars data
2.1 1.1 Using Help
?mtcars
A data frame with 32 observations on 11 (numeric) variables.
[, 1] mpg Miles/(US) gallon
[, 2] cyl Number of cylinders
[, 3] disp Displacement (cu.in.)
[, 4] hp Gross horsepower
[, 5] drat Rear axle ratio
[, 6] wt Weight (1000 lbs)
[, 7] qsec 1/4 mile time
[, 8] vs Engine (0 = V-shaped, 1 = straight)
[, 9] am Transmission (0 = automatic, 1 = manual)
[,10] gear Number of forward gears
[,11] carb Number of carburetors Note]
2.2 1.2 Reading data and converting to a tibble (cars)
head(mtcars)
class(mtcars)
[1] "data.frame"
cars <-
mtcars %>% # piping operator from dplyr (shortcut: Ctrl+Shift+M)
rownames_to_column() %>% # do this before changing the data to tibble as the conversion will remove rownames in tibble.
as_tibble() %>%
rename(model = rowname) %>%
print (n = 20, width = Inf)
# A tibble: 32 × 12
model mpg cyl disp hp drat wt qsec vs am
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0 1
2 Mazda RX4 Wag 21 6 160 110 3.9 2.88 17.0 0 1
3 Datsun 710 22.8 4 108 93 3.85 2.32 18.6 1 1
4 Hornet 4 Drive 21.4 6 258 110 3.08 3.22 19.4 1 0
5 Hornet Sportabout 18.7 8 360 175 3.15 3.44 17.0 0 0
6 Valiant 18.1 6 225 105 2.76 3.46 20.2 1 0
7 Duster 360 14.3 8 360 245 3.21 3.57 15.8 0 0
8 Merc 240D 24.4 4 147. 62 3.69 3.19 20 1 0
9 Merc 230 22.8 4 141. 95 3.92 3.15 22.9 1 0
10 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1 0
11 Merc 280C 17.8 6 168. 123 3.92 3.44 18.9 1 0
12 Merc 450SE 16.4 8 276. 180 3.07 4.07 17.4 0 0
13 Merc 450SL 17.3 8 276. 180 3.07 3.73 17.6 0 0
14 Merc 450SLC 15.2 8 276. 180 3.07 3.78 18 0 0
15 Cadillac Fleetwood 10.4 8 472 205 2.93 5.25 18.0 0 0
16 Lincoln Continental 10.4 8 460 215 3 5.42 17.8 0 0
17 Chrysler Imperial 14.7 8 440 230 3.23 5.34 17.4 0 0
18 Fiat 128 32.4 4 78.7 66 4.08 2.2 19.5 1 1
19 Honda Civic 30.4 4 75.7 52 4.93 1.62 18.5 1 1
20 Toyota Corolla 33.9 4 71.1 65 4.22 1.84 19.9 1 1
gear carb
<dbl> <dbl>
1 4 4 2 4 4 3 4 1 4 3 1 5 3 2 6 3 1 7 3 4 8 4 2 9 4 2 10 4 4 11 4 4 12 3 3 13 3 3 14 3 3 15 3 4 16 3 4 17 3 4 18 4 1 19 4 2 20 4 1 # ℹ 12 more rows
cars
summary(cars)
model mpg cyl disp
Length:32 Min. :10.40 Min. :4.000 Min. : 71.1
Class :character 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8
Mode :character Median :19.20 Median :6.000 Median :196.3
Mean :20.09 Mean :6.188 Mean :230.7
3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0
Max. :33.90 Max. :8.000 Max. :472.0
hp drat wt qsec
Min. : 52.0 Min. :2.760 Min. :1.513 Min. :14.50
1st Qu.: 96.5 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89
Median :123.0 Median :3.695 Median :3.325 Median :17.71
Mean :146.7 Mean :3.597 Mean :3.217 Mean :17.85
3rd Qu.:180.0 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90
Max. :335.0 Max. :4.930 Max. :5.424 Max. :22.90
vs am gear carb
Min. :0.0000 Min. :0.0000 Min. :3.000 Min. :1.000
1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
Median :0.0000 Median :0.0000 Median :4.000 Median :2.000
Mean :0.4375 Mean :0.4062 Mean :3.688 Mean :2.812
3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
Max. :1.0000 Max. :1.0000 Max. :5.000 Max. :8.000
glimpse(cars)
Rows: 32
Columns: 12
$ model <chr> "Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "H…
$ mpg <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8…
$ cyl <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8…
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 1…
$ hp <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 18…
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92…
$ wt <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3…
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 1…
$ vs <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0…
$ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0…
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3…
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2…
skimr::skim(cars)
| Data summary | |
| Name | cars |
| Number of rows | 32 |
| Number of columns | 12 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 11 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| model | 0 | 1 | 7 | 19 | 0 | 32 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| mpg | 0 | 1 | 20.09 | 6.03 | 10.40 | 15.43 | 19.20 | 22.80 | 33.90 | ▃▇▅▁▂ |
| cyl | 0 | 1 | 6.19 | 1.79 | 4.00 | 4.00 | 6.00 | 8.00 | 8.00 | ▆▁▃▁▇ |
| disp | 0 | 1 | 230.72 | 123.94 | 71.10 | 120.83 | 196.30 | 326.00 | 472.00 | ▇▃▃▃▂ |
| hp | 0 | 1 | 146.69 | 68.56 | 52.00 | 96.50 | 123.00 | 180.00 | 335.00 | ▇▇▆▃▁ |
| drat | 0 | 1 | 3.60 | 0.53 | 2.76 | 3.08 | 3.70 | 3.92 | 4.93 | ▇▃▇▅▁ |
| wt | 0 | 1 | 3.22 | 0.98 | 1.51 | 2.58 | 3.33 | 3.61 | 5.42 | ▃▃▇▁▂ |
| qsec | 0 | 1 | 17.85 | 1.79 | 14.50 | 16.89 | 17.71 | 18.90 | 22.90 | ▃▇▇▂▁ |
| vs | 0 | 1 | 0.44 | 0.50 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | ▇▁▁▁▆ |
| am | 0 | 1 | 0.41 | 0.50 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | ▇▁▁▁▆ |
| gear | 0 | 1 | 3.69 | 0.74 | 3.00 | 3.00 | 4.00 | 4.00 | 5.00 | ▇▁▆▁▂ |
| carb | 0 | 1 | 2.81 | 1.62 | 1.00 | 2.00 | 2.00 | 4.00 | 8.00 |
3 Using a built in plotting function
hist(cars$disp, breaks = 10)
#barplot will be discussed later
library(lattice) xyplot(mpg ~ wt, cars) #xyplot(y~x,data)
histogram(cars$disp, breaks = 10)
4 4. ggplot2
- we will use ggplot2 – the best tool in the market for data visualization – from now on.
4.1 4.1. Elaborate Examples
4.1.1 4.1.1 x & y are both continuous with moderator & labeller()
cars |>
count(cyl)
cyl <dbl> |
n <int> |
|---|---|
| 4 | 11 |
| 6 | 7 |
| 8 | 14 |
3 rows
easy_labels <- c("4" = "4 Cylinder Cars",
"6" = "6 Cylinder Cars",
"8" = "8 Cylinder Cars"
)
cars %>%
mutate(cyl = factor(cyl)) %>%
ggplot(aes(x = mpg, y = disp, color = cyl)) +
geom_point(size=3,
color='black'
) + #geom
# geom_jitter() +
geom_smooth(method = lm, se = FALSE) +
# facet_grid(cols = vars(cyl),
facet_wrap(~ cyl,
#scales = "free_y",
ncol = 1,
strip.position = "top",
labeller = labeller(cyl = easy_labels)
) + #faceting
scale_y_continuous(limits = c(0, NA), expand= c(0,0)) +
coord_flip() + #coordinate
theme_economist() + #labels
labs(title = 'MPG vs Displacement',
x = 'Miles Per Gallon',
y = 'Displacement') +
theme(
strip.placement = "outside",
strip.background = element_blank(),
panel.background = element_blank(),
panel.grid = element_blank(),
axis.line = element_line()
) +
guides(color = 'none')
easy_labels_n <- as_labeller(c(4 = “4 Cylinder Cars”, 6 = “6 Cylinder Cars”, 8 = “8 Cylinder Cars” ) )
ggplot(data = cars, aes(x = disp, y = mpg, color = factor(cyl))) + #data geom_point(size=3) + #geometry facet_grid(~ factor(cyl), labeller = easy_labels_n ) + #faceting theme_bw() + #theme type labs(title = ‘MPG vs Displacement’, #labels x = ‘Displacement’, y = ‘Miles Per Gallon’, color = “# of Cylender” ) + guides(color = ‘none’)
ggplot(data = cars, aes(x = mpg)) + geom_histogram(binwidth = 5, color = “red”, fill = “blue”)
ggplot(data = cars, aes(x = mpg, fill = mpg)) + geom_histogram(binwidth = 3, color = “red”, fill = “blue”)
barplot(table(cars$cyl)) # from graphics package
5 the same as above in ggplot2
ggplot(data = cars, aes(x = factor(cyl))) + geom_bar(fill = “blue”)
ggplot(data = cars, aes(x = factor(cyl), fill = factor(cyl))) + geom_bar() + guides(fill = “none”) # remove fill legend.
ggplot(data = mpg, aes(x = manufacturer, fill = manufacturer)) + #not sorted geom_bar(stat = “count”, show.legend = FALSE) + coord_flip()
6 use reorder bars in inside ggplot function
mpg %>% count(manufacturer, sort = TRUE) %>% ggplot(aes(x = reorder(manufacturer, n), y = n, fill = manufacturer)) + #reorder() or fct_reorder()/fct_rev() geom_bar(stat = “identity”, show.legend = FALSE)+ coord_flip()
7 Use reorder bars inside mutate function during wrangling
mpg %>% count(manufacturer, sort = TRUE) %>% mutate(manufacturer = fct_reorder(manufacturer, n) ) %>% ggplot(aes(x = manufacturer, y = n, fill = manufacturer)) + geom_bar(stat = “identity”, show.legend = FALSE)+ coord_flip()
ggplot(data = cars, aes(x = factor(cyl), fill = factor(am))) + geom_bar(stat = “count”, position = “stack”) + labs(x = “Cylinder Size”, y = “# of Cars”, fill = “Automatic vs. Manual” )
ggplot(data = cars, aes(x = factor(cyl), fill = factor(am))) + geom_bar(position = “dodge”)+ labs(x = “Cylinder Size”, y = “# of Cars”, fill = “Automatic vs. Manual” )
8 stack.
ggplot(data = mpg, aes(x = manufacturer, fill = class)) + geom_bar(stat = “count”, position = “stack”) + theme_economist() + theme(axis.text.x = element_text(angle = 90, hjust = 0)) + labs(title = “# of Cars by Class for Each Manufacturer”, x = NULL, y = “# of cars”, ) + coord_flip()
9 fill.
ggplot(data = mpg, aes(x = manufacturer, fill = class)) + geom_bar(stat = “count”, position = “fill”) + #fill converts count to fraction. scale_y_continuous(labels = percent) + theme_economist() + theme(axis.text.x = element_text(angle = 0, hjust = 0)) + labs(title = “Percent of cars by class for each Manufacturer”, x = ““, y = NULL, ) + coord_flip()
10 manufacturer by class
ggplot(data = mpg, aes(x = manufacturer, fill = class)) + geom_bar(stat = “count”) + facet_wrap(~ class) + theme_bw() + labs(title = “# of Cars for Manufacturer by class”, x = NULL, y = “# of cars”, ) + coord_flip() + guides(fill = “none”)
11 class by manufacturer
ggplot(data = mpg, aes(x = class, fill = manufacturer)) + geom_bar(stat = “count”) + facet_wrap(~ manufacturer) + theme_bw() + labs(title = “# of Cars for Class by Manufacturer”, x = NULL, y = “# of cars”, ) + coord_flip()+ guides(fill = “none”)
mpg %>% ggplot(aes(cyl, cty))+ geom_point() + geom_smooth(method = “lm”, se = FALSE) + #lm = linear model; se = standard error geom_jitter()+ theme_economist_white()+ labs(title = “City Mileage versus Cylinders”, subtitle = “Scatter and jitter plot with regression line”, caption = “Source: mpg dataset”, x = “# of Cylnders”, y = “City mileage”, )