+ - 0:00:00
Notes for current slide
Notes for next slide

Tables and Fonts

Daniel Anderson

Week 8, Class 1

1 / 73

Data viz in the wild

Sarah Donaldson

Hyeonjin

Anwesha & Ping on deck

2 / 73

Agenda

  • Tables with gt
  • Fonts with showtext and/or extrafont
3 / 73

Agenda

  • Tables with gt
  • Fonts with showtext and/or extrafont

Learning objectives

  • Be comfortable with the basics of gt
    • create a table
    • format columns
    • create spanner heads
    • etc.
  • Understand how to use additional fonts (if you so choose)
3 / 73
4 / 73

Overview

  • Pipe-oriented

  • Beautiful tables easy

  • Spanner heads/grouping used to be a total pain - not so anymore

  • Renders to HTML/PDF without even thinking about it

5 / 73

Overview

  • Pipe-oriented

  • Beautiful tables easy

  • Spanner heads/grouping used to be a total pain - not so anymore

  • Renders to HTML/PDF without even thinking about it

Probably my favorite package for creating static tables, although kableExtra is great too.

My experience is that fewer people are generally familiar with gt, which is why I cover it here.

5 / 73

Install

install.packages("gt")
# or
remotes::install_github("rstudio/gt")
6 / 73

The hard part

  • Getting your data in the format you want a table in

  • Utilize your pivot_* skills regularly

library(fivethirtyeight)
flying
## # A tibble: 1,040 x 27
## respondent_id gender age height children_under_18 household_income
## <dbl> <chr> <ord> <ord> <lgl> <ord>
## 1 3436139758 <NA> <NA> <NA> NA <NA>
## 2 3434278696 Male 30-44 "6'3\"" TRUE <NA>
## 3 3434275578 Male 30-44 "5'8\"" FALSE $100,000 - $149,999
## 4 3434268208 Male 30-44 "5'11\"" FALSE $0 - $24,999
## 5 3434250245 Male 30-44 "5'7\"" FALSE $50,000 - $99,999
## 6 3434245875 Male 30-44 "5'9\"" TRUE $25,000 - $49,999
## # … with 1,034 more rows, and 21 more variables: education <ord>,
## # location <chr>, frequency <ord>, recline_frequency <ord>,
## # recline_obligation <lgl>, recline_rude <ord>, recline_eliminate <lgl>,
## # switch_seats_friends <ord>, switch_seats_family <ord>,
## # wake_up_bathroom <ord>, wake_up_walk <ord>, baby <ord>,
## # unruly_child <ord>, two_arm_rests <chr>, middle_arm_rest <chr>,
## # shade <chr>, unsold_seat <ord>, talk_stranger <ord>, get_up <ord>,
## # electronics <lgl>, smoked <lgl>
7 / 73
flying %>%
count(gender, age, recline_frequency)
## # A tibble: 53 x 4
## gender age recline_frequency n
## <chr> <ord> <ord> <int>
## 1 Female 18-29 Never 24
## 2 Female 18-29 Once in a while 36
## 3 Female 18-29 About half the time 10
## 4 Female 18-29 Usually 13
## 5 Female 18-29 Always 10
## 6 Female 18-29 <NA> 19
## # … with 47 more rows
8 / 73
smry <- flying %>%
count(gender, age, recline_frequency) %>%
drop_na(age,recline_frequency) %>%
pivot_wider(names_from = "age",
values_from = "n")
smry
## # A tibble: 10 x 6
## gender recline_frequency `18-29` `30-44` `45-60` `> 60`
## <chr> <ord> <int> <int> <int> <int>
## 1 Female Never 24 21 19 23
## 2 Female Once in a while 36 25 30 36
## 3 Female About half the time 10 22 18 17
## 4 Female Usually 13 22 26 28
## 5 Female Always 10 21 29 12
## 6 Male Never 24 17 20 18
## # … with 4 more rows
9 / 73

Turn into table

library(gt)
smry %>%
gt()
10 / 73

Turn into table

library(gt)
smry %>%
gt()

Disclaimer: these all look slightly different on the slides

10 / 73

gender recline_frequency 18-29 30-44 45-60 > 60
Female Never 24 21 19 23
Female Once in a while 36 25 30 36
Female About half the time 10 22 18 17
Female Usually 13 22 26 28
Female Always 10 21 29 12
Male Never 24 17 20 18
Male Once in a while 19 39 40 29
Male About half the time 11 11 16 11
Male Usually 14 30 15 27
Male Always 11 14 21 14
11 / 73

Add gender as a grouping variable

smry %>%
group_by(gender) %>%
gt()
12 / 73

recline_frequency 18-29 30-44 45-60 > 60
Female
Never 24 21 19 23
Once in a while 36 25 30 36
About half the time 10 22 18 17
Usually 13 22 26 28
Always 10 21 29 12
Male
Never 24 17 20 18
Once in a while 19 39 40 29
About half the time 11 11 16 11
Usually 14 30 15 27
Always 11 14 21 14
13 / 73

recline_frequency 18-29 30-44 45-60 > 60
Female
Never 24 21 19 23
Once in a while 36 25 30 36
About half the time 10 22 18 17
Usually 13 22 26 28
Always 10 21 29 12
Male
Never 24 17 20 18
Once in a while 19 39 40 29
About half the time 11 11 16 11
Usually 14 30 15 27
Always 11 14 21 14

This is an example of a table that looks better with the default CSS

13 / 73

Add a spanner head

smry %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
)
14 / 73

recline_frequency Age Range
18-29 30-44 45-60 > 60
Female
Never 24 21 19 23
Once in a while 36 25 30 36
About half the time 10 22 18 17
Usually 13 22 26 28
Always 10 21 29 12
Male
Never 24 17 20 18
Once in a while 19 39 40 29
About half the time 11 11 16 11
Usually 14 30 15 27
Always 11 14 21 14
15 / 73

Change column names

smry %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
) %>%
cols_label(recline_frequency = "Recline")
16 / 73

Recline Age Range
18-29 30-44 45-60 > 60
Female
Never 24 21 19 23
Once in a while 36 25 30 36
About half the time 10 22 18 17
Usually 13 22 26 28
Always 10 21 29 12
Male
Never 24 17 20 18
Once in a while 19 39 40 29
About half the time 11 11 16 11
Usually 14 30 15 27
Always 11 14 21 14
17 / 73

Align columns

smry %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
) %>%
cols_label(recline_frequency = "Recline") %>%
cols_align(align = "left",
columns = vars(recline_frequency))
18 / 73

Align columns

smry %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
) %>%
cols_label(recline_frequency = "Recline") %>%
cols_align(align = "left",
columns = vars(recline_frequency))

They are already left-aligned because of the CSS, but that's not typical

18 / 73

Recline Age Range
18-29 30-44 45-60 > 60
Female
Never 24 21 19 23
Once in a while 36 25 30 36
About half the time 10 22 18 17
Usually 13 22 26 28
Always 10 21 29 12
Male
Never 24 17 20 18
Once in a while 19 39 40 29
About half the time 11 11 16 11
Usually 14 30 15 27
Always 11 14 21 14
19 / 73

Add a title

smry %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
) %>%
cols_label(recline_frequency = "Recline") %>%
cols_align(align = "left",
columns = vars(recline_frequency))
tab_header(
title = "Airline Passengers",
subtitle = "Leg space is limited, what do you do?"
)
20 / 73

Airline Passengers
Leg space is limited, what do you do?
Recline Age Range
18-29 30-44 45-60 > 60
Female
Never 24 21 19 23
Once in a while 36 25 30 36
About half the time 10 22 18 17
Usually 13 22 26 28
Always 10 21 29 12
Male
Never 24 17 20 18
Once in a while 19 39 40 29
About half the time 11 11 16 11
Usually 14 30 15 27
Always 11 14 21 14
21 / 73

Format columns

smry %>%
mutate(across(c(`18-29`, `30-44`, `45-60`, `> 60`),
~.x/100)) %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
) %>%
fmt_percent(
vars(`18-29`, `30-44`, `45-60`, `> 60`),
decimals = 0
) %>%
cols_label(recline_frequency = "Recline") %>%
cols_align(align = "left",
columns = vars(recline_frequency)) %>%
tab_header(
title = "Airline Passengers",
subtitle = "Leg space is limited, what do you do?"
)
22 / 73

Airline Passengers
Leg space is limited, what do you do?
Recline Age Range
18-29 30-44 45-60 > 60
Female
Never 24% 21% 19% 23%
Once in a while 36% 25% 30% 36%
About half the time 10% 22% 18% 17%
Usually 13% 22% 26% 28%
Always 10% 21% 29% 12%
Male
Never 24% 17% 20% 18%
Once in a while 19% 39% 40% 29%
About half the time 11% 11% 16% 11%
Usually 14% 30% 15% 27%
Always 11% 14% 21% 14%
23 / 73

Add a source note

smry %>%
mutate(across(c(`18-29`, `30-44`, `45-60`, `> 60`),
~.x/100)) %>%
group_by(gender) %>%
gt() %>%
tab_spanner(
label = "Age Range",
columns = vars(`18-29`, `30-44`, `45-60`, `> 60`)
) %>%
fmt_percent(
vars(`18-29`, `30-44`, `45-60`, `> 60`),
decimals = 0
) %>%
cols_label(recline_frequency = "Recline") %>%
cols_align(align = "left",
columns = vars(recline_frequency)) %>%
tab_header(
title = "Airline Passengers",
subtitle = "Leg space is limited, what do you do?"
) %>%
tab_source_note(
source_note = md("Data from [fivethirtyeight](https://fivethirtyeight.com/features/airplane-etiquette-recline-seat/)")
)
24 / 73

Airline Passengers
Leg space is limited, what do you do?
Recline Age Range
18-29 30-44 45-60 > 60
Female
Never 24% 21% 19% 23%
Once in a while 36% 25% 30% 36%
About half the time 10% 22% 18% 17%
Usually 13% 22% 26% 28%
Always 10% 21% 29% 12%
Male
Never 24% 17% 20% 18%
Once in a while 19% 39% 40% 29%
About half the time 11% 11% 16% 11%
Usually 14% 30% 15% 27%
Always 11% 14% 21% 14%
Data from fivethirtyeight
25 / 73

Color cells

... %>%
data_color(
vars(`18-29`, `30-44`, `45-60`, `> 60`),
colors = scales::col_numeric(
palette = c("#FFFFFF", "#FF0000"),
domain = NULL
)
) %>%
...
26 / 73

Airline Passengers
Leg space is limited, what do you do?
Recline Age Range
18-29 30-44 45-60 > 60
Female
Never 24% 21% 19% 23%
Once in a while 36% 25% 30% 36%
About half the time 10% 22% 18% 17%
Usually 13% 22% 26% 28%
Always 10% 21% 29% 12%
Male
Never 24% 17% 20% 18%
Once in a while 19% 39% 40% 29%
About half the time 11% 11% 16% 11%
Usually 14% 30% 15% 27%
Always 11% 14% 21% 14%
Data from fivethirtyeight
27 / 73

What else?

  • Lots more it can do, and lots more in development
  • See the website
28 / 73

What else?

  • Lots more it can do, and lots more in development
  • See the website

Thomas Mock does a lot of great work with tables and often has tutorials showing your how to go further (e.g., see here and here and here).

28 / 73

A few other table options

29 / 73

kableExtra

A few quick examples

Make sure to specify results = "asis" in your chunk options.

library(knitr)
library(kableExtra)
dt <- mtcars[1:5, 1:6]
kable(dt) %>%
kable_styling("striped") %>%
column_spec(5:7, bold = TRUE)
mpg cyl disp hp drat wt
Mazda RX4 21.0 6 160 110 3.90 2.62
Mazda RX4 Wag 21.0 6 160 110 3.90 2.88
Datsun 710 22.8 4 108 93 3.85 2.32
Hornet 4 Drive 21.4 6 258 110 3.08 3.21
Hornet Sportabout 18.7 8 360 175 3.15 3.44
30 / 73
kable(dt) %>%
kable_styling("striped") %>%
column_spec(5:7, bold = TRUE) %>%
row_spec(c(2, 4),
bold = TRUE,
color = "#EFF3F7",
background = "#71B0DE")
mpg cyl disp hp drat wt
Mazda RX4 21.0 6 160 110 3.90 2.62
Mazda RX4 Wag 21.0 6 160 110 3.90 2.88
Datsun 710 22.8 4 108 93 3.85 2.32
Hornet 4 Drive 21.4 6 258 110 3.08 3.21
Hornet Sportabout 18.7 8 360 175 3.15 3.44
31 / 73
kable(dt) %>%
kable_styling("striped", full_width = FALSE) %>%
pack_rows(
"Group 1", 1, 3,
label_row_css = "background-color: #666; color: #fff;"
) %>%
pack_rows(
"Group 2", 4, 5,
label_row_css = "background-color: #666; color: #fff;")
mpg cyl disp hp drat wt
Group 1
Mazda RX4 21.0 6 160 110 3.90 2.62
Mazda RX4 Wag 21.0 6 160 110 3.90 2.88
Datsun 710 22.8 4 108 93 3.85 2.32
Group 2
Hornet 4 Drive 21.4 6 258 110 3.08 3.21
Hornet Sportabout 18.7 8 360 175 3.15 3.44
32 / 73

KableExtra wrapup

Many other options, please see the documentation. Works well for PDF and HTML.

33 / 73

KableExtra wrapup

Many other options, please see the documentation. Works well for PDF and HTML.

What about Microsoft Word?

33 / 73

flextable

34 / 73

Many others

35 / 73

Many others

Particularly helpful for modeling

35 / 73

Many others

Particularly helpful for modeling

For descriptives

35 / 73

reactable

My favorite for interactive tables

36 / 73

Works great with shiny too

37 / 73

Penguins data

library(palmerpenguins)
library(reactable)
reactable(penguins)
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
Adelie
Torgersen
2007
Adelie
Torgersen
36.7
19.3
193
3450
female
2007
Adelie
Torgersen
39.3
20.6
190
3650
male
2007
Adelie
Torgersen
38.9
17.8
181
3625
female
2007
Adelie
Torgersen
39.2
19.6
195
4675
male
2007
Adelie
Torgersen
34.1
18.1
193
3475
2007
Adelie
Torgersen
42
20.2
190
4250
2007
1–10 of 344 rows
...
38 / 73

Rename columns

penguins %>%
reactable(
columns = list(
bill_length_mm = colDef(name = "Bill Length (mm)"),
bill_depth_mm = colDef(name = "Bill Depth (mm)")
)
)
39 / 73

species
island
Bill Length (mm)
Bill Depth (mm)
flipper_length_mm
body_mass_g
sex
year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
Adelie
Torgersen
2007
Adelie
Torgersen
36.7
19.3
193
3450
female
2007
Adelie
Torgersen
39.3
20.6
190
3650
male
2007
Adelie
Torgersen
38.9
17.8
181
3625
female
2007
Adelie
Torgersen
39.2
19.6
195
4675
male
2007
Adelie
Torgersen
34.1
18.1
193
3475
2007
Adelie
Torgersen
42
20.2
190
4250
2007
1–10 of 344 rows
...
40 / 73

Or use a function

library(stringr)
penguins %>%
reactable(
defaultColDef = colDef(
header = function(x) str_to_title(gsub("_", " ", x))
)
)
41 / 73

Species
Island
Bill Length Mm
Bill Depth Mm
Flipper Length Mm
Body Mass G
Sex
Year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
Adelie
Torgersen
2007
Adelie
Torgersen
36.7
19.3
193
3450
female
2007
Adelie
Torgersen
39.3
20.6
190
3650
male
2007
Adelie
Torgersen
38.9
17.8
181
3625
female
2007
Adelie
Torgersen
39.2
19.6
195
4675
male
2007
Adelie
Torgersen
34.1
18.1
193
3475
2007
Adelie
Torgersen
42
20.2
190
4250
2007
1–10 of 344 rows
...
42 / 73

Add filter

reactable(penguins, filterable = TRUE)
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
Adelie
Torgersen
2007
Adelie
Torgersen
36.7
19.3
193
3450
female
2007
Adelie
Torgersen
39.3
20.6
190
3650
male
2007
Adelie
Torgersen
38.9
17.8
181
3625
female
2007
Adelie
Torgersen
39.2
19.6
195
4675
male
2007
Adelie
Torgersen
34.1
18.1
193
3475
2007
Adelie
Torgersen
42
20.2
190
4250
2007
1–10 of 344 rows
...
43 / 73

Searchable

reactable(penguins, searchable = TRUE)
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
Adelie
Torgersen
2007
Adelie
Torgersen
36.7
19.3
193
3450
female
2007
Adelie
Torgersen
39.3
20.6
190
3650
male
2007
Adelie
Torgersen
38.9
17.8
181
3625
female
2007
Adelie
Torgersen
39.2
19.6
195
4675
male
2007
Adelie
Torgersen
34.1
18.1
193
3475
2007
Adelie
Torgersen
42
20.2
190
4250
2007
1–10 of 344 rows
...
44 / 73

Pagination

reactable(penguins, defaultPageSize = 3)
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
1–3 of 344 rows
...
45 / 73

Page jump

reactable(penguins,
defaultPageSize = 3,
paginationType = "jump")
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie
Torgersen
39.1
18.7
181
3750
male
2007
Adelie
Torgersen
39.5
17.4
186
3800
female
2007
Adelie
Torgersen
40.3
18
195
3250
female
2007
1–3 of 344 rows
of 115
46 / 73

Grouping

reactable(penguins, groupBy = c("species", "island"))
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie (3)
Gentoo (1)
Chinstrap (1)
47 / 73

Aggregate

penguins %>%
reactable(
groupBy = c("species", "island"),
columns = list(
bill_length_mm = colDef(aggregate = "mean",
format = colFormat(digits = 2))
)
)
species
island
bill_length_mm
bill_depth_mm
flipper_length_mm
body_mass_g
sex
year
Adelie (3)
38.81
Gentoo (1)
47.50
Chinstrap (1)
48.83
48 / 73

Sparklines

library(sparkline)
table_data <- penguins %>%
group_by(species) %>%
summarize(bill_length = list(bill_length_mm)) %>%
mutate(boxplot = NA,
sparkline = NA)
table_data
## # A tibble: 3 x 4
## species bill_length boxplot sparkline
## * <fct> <list> <lgl> <lgl>
## 1 Adelie <dbl [152]> NA NA
## 2 Chinstrap <dbl [68]> NA NA
## 3 Gentoo <dbl [124]> NA NA
49 / 73
table_data %>%
reactable(
columns = list(
bill_length = colDef(cell = function(value) {
sparkline(value, type = "bar")
}),
boxplot = colDef(cell = function(value, index) {
sparkline(table_data$bill_length[[index]], type = "box")
}),
sparkline = colDef(cell = function(value, index) {
sparkline(table_data$bill_length[[index]])
})
)
)
50 / 73

species
bill_length
boxplot
sparkline
Adelie
Chinstrap
Gentoo
51 / 73

Lots more!

Idea of today is not to teach you everything, but to give you an idea of what's possible. Check out the documentation for more information.

52 / 73

Fonts

53 / 73

General advice

  • Use different fonts to distinguish things

    • Specifically code
    • Consider different fonts for different heading levels, and/or to distinguish headers from the body
  • Always choose a sans-serif font for code

  • Explore and try - it makes a big impact on the overall look/feel (bigger than you may expect if you haven't played with fonts much before)

  • Try not to get sucked into too deep of a rabbit hole

54 / 73

{ragg}

Brand new pacakge - just learning about it myself.

Alternative device to Cairo, png, etc.

See the announcement here

After install, be sure to set Global Options > General > Graphics to AGG

Use with RMarkdown with knitr::opts_chunk$set(dev = "ragg_png")

Will automatically detect fonts you have installed on your computer

55 / 73
ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
labs(title = "Fuel Efficiency of 32 Cars",
x = "Weight (x1000 lb)",
y = "Miles per Gallon") +
theme(text = element_text(family = "Luminari", size = 30))

56 / 73

Support for lots of things!

Ligatures and font-awesome icons

library(ragg)
ggplot() +
geom_text(
aes(x = 0, y = 2, label = "x <- y != z"),
family = "Fira Code"
) +
labs(title = "twitter") +
theme(plot.title = element_text(
family = "Font Awesome 5 brands"
)
)
57 / 73

58 / 73

emojis

ggplot(mtcars, aes(disp, mpg)) +
geom_text(label = "🎉",
family = "Apple Color Emoji",
size = 10)

59 / 73

Google fonts

https://fonts.google.com

  • Open source, designed for the web

  • Good place to explore fonts

  • Can be incorporated via the {showtext} package!

60 / 73

{showtext} example

devtools::install_github("yixuan/showtext")
library(showtext)
font_add_google('Monsieur La Doulaise', "mld")
font_add_google('Special Elite', "se")
showtext_auto()
quartz()
ggplot(mtcars, aes(disp, mpg)) +
geom_point() +
labs(title = "An amazing title",
subtitle = "with the world's most boring dataset") +
theme(plot.subtitle = element_text(size = 18, family = "se"),
plot.title = element_text(size = 22, family = "mld"),
axis.title = element_text(size = 18, family = "mld"),
axis.text.x = element_text(size = 12, family = "se"),
axis.text.y = element_text(size = 12, family = "se"))
61 / 73
62 / 73

Why fonts matter

A few examples of epic fails

h/t Will Chase

63 / 73

Megaflicks

64 / 73
65 / 73
66 / 73

Quick aside

Change the font of your R Markdown!

Create a CSS code chunk - write tiny bit of CSS - voila!

@import url('https://fonts.googleapis.com/css?family=Akronim&display=swap');
body {
font-family: 'Akronim', cursive;
}
67 / 73

Render!

68 / 73

Aside

I actually did this for these slides to make the tables a bit smaller!

69 / 73

Resource for learning more

  • I'm not an expert on fonts. I have mostly just picked what looks nice to me.
70 / 73

Resource for learning more

  • I'm not an expert on fonts. I have mostly just picked what looks nice to me.

70 / 73

Best I've heard of is practical typography

71 / 73

Identify fonts

Use others work to help you - I found the font for these slides from a different theme that I liked.

Use google chrome's developer tools to help!

72 / 73

Next time

Create your own blog!

73 / 73

Data viz in the wild

Sarah Donaldson

Hyeonjin

Anwesha & Ping on deck

2 / 73
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow