A Great Summer of Great Tables

My experience as a 2025 Posit Intern

Jules Walzer-Goldfeld

Hello!

Who are you listening to

  • 🐄 CS and Math at Williams College

  • 🇪🇸 Taught English in Spain

  • 💡 I enjoy patterns and helping people see patterns

  • 🧗 I like to play table tennis, soccer, chess, and climb rocks

  • 🔢 I like logic puzzles!

RStudio origin story

What I’ve done this summer

gt-extras

A Python port of Thomas Mock’s R package: {gtExtras}

gt-extras

gt-extras

Plotting

Coloring

Theming

Iconing + Imaging

Utilities

gt_plt_bar()

Car mfr year hp hp_rpm trq trq_rpm mpg_c mpg_h
LaFerrari Ferrari 2015
NSX Acura 2017
GT-R Nissan 2016
Aventador Lamborghini 2015
Huracan Lamborghini 2015
Gallardo Lamborghini 2014
Continental GT Bentley 2016
Granturismo Maserati 2016
Quattroporte Maserati 2016

gt_color_box()

Island size
Asia
16988
Africa
11506
North America
9390
South America
6795
Antarctica
5500
Europe
3745
Australia
2968
Greenland
840
New Guinea
306
Borneo
280

gt_theme_dot_matrix()

Dot Matrix Theme
New York Air Quality Measurements
Time Measurement
Year Month Day Ozone,
ppbV
Solar R.,
cal/m2
Wind,
mph
Temp,
°F
1973 5 1 41.0 190.0 7.4 67
1973 5 2 36.0 118.0 8.0 72
1973 5 3 12.0 149.0 12.6 74
1973 5 4 18.0 313.0 11.5 62
1973 5 5 14.3 56
1973 5 6 28.0 14.9 66
1973 5 7 23.0 299.0 8.6 65
1973 5 8 19.0 99.0 13.8 59
1973 5 9 8.0 19.0 20.1 61
1973 5 10 194.0 8.6 69

gt_fa_rank_change()

name 1996_2001 2001_2006 2006_2011
Addington Highlands
Angles down
-0.0111
Angles up
0.0458
Equals
0.002
Adelaide Metcalfe
Equals
0.0067
Equals
-0.0044
Angles down
-0.0341
Adjala-Tosorontio
Angles up
0.0773
Angles up
0.0608
Equals
-0.0086
Admaston/Bromley
Equals
-0.0046
Angles down
-0.0382
Angles up
0.0471
Ajax
Angles up
0.1447
Angles up
0.2226
Angles up
0.2155
Alberton
Angles down
-0.0691
Equals
0.0021
Angles down
-0.0981
Alfred and Plantagenet
Angles up
0.0334
Equals
0.0071
Angles up
0.0626
Algonquin Highlands
Angles up
0.083
Angles up
0.0816
Angles up
0.1063
Alnwick/Haldimand
Angles up
0.0575
Angles up
0.1008
Angles up
0.0283
Amaranth
Angles up
0.0928
Angles up
0.0199
Angles up
0.0307

gt_two_column_layout()

Double Table
name_given address
Ruth 4299 Bobcat Drive
Peter 3705 Hidden Pond Road
Fanette 4200 Swick Hill Street
Judyta 2287 Cherry Ridge Drive
Leonard 1496 Hillhaven Drive
Maymun 4088 Barnes Avenue
Alma 4897 Duffy Street
Mariana 2016 Kovar Road
Ning 3892 Bel Meadow Drive
Martin 1850 Valley Lane
Cendrillon Rue de Liège 466
Adélaïde Orchideeenlaan 470
Sezer Rue de la Tannerie 111
Gilles Avenue des Sartiaux 259
Gabriele Maskenstraat 360
Josette Rue des Honnelles 220
name_given address
Rabah Rue du Cornet 25
Michelina Orchideeenlaan 231
Amélie Rue de Birmingham 340
Searlas Rue de Liège 46
Stanisław ul. Osinowa 129
Wiola ul. Narwicka 103
Zdzisława ul. Spokojna 139
Beatrycze ul. Grochowa 59
Iwan ul. Świętego Wawrzyńca 51
Albina ul. Królowej Jadwigi 127
Izabella ul. Młynka Tadeusza 72
Gaweł ul. Uzdowska 90
Krzysztof ul. Górna 109
Konstancja Pl. Grunwaldzki 17
Pava 6 Guild Street
Nathan 8 Dunmow Road

gt-extras

2011 NFL Season at a Glance
Super Bowl XLVI: New York Giants def. New England Patriots
Team Record Scoring Season Trends
Points For vs Points Against Point Diff Games Streak
AFC East
NE 14-2-0
28
16
11.9
Turn up
7
MIA 10-6-0
23
24
-1.1
Turn down
-1
BUF 7-9-0
25
24
1.3
Turn down
-2
NYJ 5-11-0
17
26
-8.4
Turn up
1
AFC North
PIT 11-5-0
25
20
4.5
Turn up
7
BAL 8-8-0
21
20
1.4
Turn down
-2
CIN 6-9-1
20
20
0.6
Turn up
1
CLE 1-15-0
16
28
-11.8
Turn down
-1
AFC South
TEN 9-7-0
24
24
0.2
Turn up
1
HOU 9-7-0
17
20
-3.1
Turn down
-1
IND 8-8-0
26
24
1.2
Turn up
1
JAX 3-13-0
20
25
-5.1
Turn down
-1
AFC West
KC 12-4-0
24
19
4.9
Turn up
2
OAK 12-4-0
26
24
1.9
Turn down
-1
DEN 9-7-0
21
19
2.2
Turn up
1
SD 5-11-0
26
26
-0.8
Turn down
-5
Source: Lee Sharpe, nflverse
Team Record Scoring Season Trends
Points For vs Points Against Point Diff Games Streak
NFC East
DAL 13-3-0
26
19
7.2
Turn down
-1
NYG 11-5-0
19
18
1.6
Turn up
1
WAS 8-7-1
25
24
0.8
Turn down
-1
PHI 7-9-0
23
21
2.2
Turn up
2
NFC North
GB 10-6-0
27
24
2.8
Turn up
6
DET 9-7-0
22
22
-0.8
Turn down
-3
MIN 8-8-0
20
19
1.2
Turn up
1
CHI 3-13-0
17
25
-7.5
Turn down
-4
NFC South
ATL 11-5-0
34
25
8.4
Turn up
4
TB 9-7-0
22
23
-0.9
Turn up
1
NO 7-9-0
29
28
0.9
Turn down
-1
CAR 6-10-0
23
25
-2.1
Turn down
-2
NFC West
SEA 10-5-1
22
18
3.9
Turn up
1
ARI 7-8-1
26
23
3.5
Turn up
2
LA 4-12-0
14
25
-10.6
Turn down
-7
SF 2-14-0
19
30
-10.7
Turn down
-1
Source: Lee Sharpe, nflverse

Plotting ➡️ gt_plt_summary()

Summary Table
45 rows x 5 cols
Type Column Plot Overview Missing Mean Median SD
Clock Date 2024-01-012024-02-0115 rows[2024-01-01 to 2024-01-07]10 rows[2024-01-07 to 2024-01-13]5 rows[2024-01-13 to 2024-01-19]10 rows[2024-01-19 to 2024-01-26]5 rows[2024-01-26 to 2024-02-01] 0.0%
signal Value 10405 rows[10 to 15]10 rows[15 to 20]10 rows[20 to 25]5 rows[25 to 30]5 rows[30 to 35]5 rows[35 to 40] 11.1% 22.50 21.00 8.83
List Category 10 rows"A"10 rows"B"10 rows"C"5 rows"D" 22.2%
Check Boolean 30 rows"True"15 rows"False" 0.0% 0.67
List Status 15 rows"Active"15 rows"Inactive" 33.3%

aside: this is awesome!

Great Tables

Great Tables

A grand 😉 new feature

A collection of different fixes to old group bugs

A row striping indexing fix with grouped data

A pair of improvements to autocoloring the text of striped rows

Income Inequality Before and After Taxes in 2020
Pre-tax to Post-tax Coefficient Population Improvement Post Taxes
Europe
France
0.52
0.28
65,905,226
Germany
0.50
0.30
83,628,661
Spain
0.52
0.33
47,679,437
Italy
0.53
0.33
59,912,714
United Kingdom
0.51
0.35
67,351,806
Asia
South Korea
0.41
0.33
51,858,440
Turkey
0.50
0.40
86,091,644
North America
United States
0.52
0.38
339,436,106
Mexico
0.43
0.42
126,798,998
Source: Data from #TidyTuesday (2025-08-05).
Dumbbell plot: Blue: post-tax Gini coefficient Gold: pre-tax Gini coefficient
Bullet plot: Percent reduction in Gini after taxes for each country, compared to its 5-year average benchmark.

What I learned this summer

Package Development

def test_gt_plt_bar_snap(snapshot, mini_gt):
    res = gt_plt_bar(gt=mini_gt, columns="num")

    assert_rendered_body(snapshot, gt=res)


@pytest.mark.parametrize("DataFrame", [pd.DataFrame, pl.DataFrame])
def test_gt_plt_summary_boolean_all_true(DataFrame):
    df = DataFrame({"boolean": [True, True, True]})

    result = gt_plt_summary(df)
    html = result.as_raw_html()

    assert "1.00" in html
    assert 'fill-opacity="1.0"' in html
    assert ">0.0%</td>" in html
src/
├── gt_extras/
│   ├── __init__.py
│   ├── plotting.py
│   ├── colors.py
│   ├── ...
│   └── tests/
│       ├── test_plotting.py
│       └── ...
├── docs/
│   ├── _quarto.yml
│   └── ...
├── .gitignore
├── Makefile
├── README.md
└── pyproject.toml
@dataclass(frozen=True)
class SummaryRowInfo:
    """Information about a single summary row"""

    id: str
    label: str  # For now, label and id are identical
    values: dict[str, str | int | float]  # TODO: consider datatype
    side: Literal["top", "bottom"]  # TODO: switch to enum
    group: GroupRowInfo


class SummaryRows(_Sequence[SummaryRowInfo]):
    """A sequence of summary rows"""

    _d: list[SummaryRowInfo]

    def __init__(self, rows: list[SummaryRowInfo] | None = None):
        self._d = []

        for row in rows or []:
            self.add_summary_row(row)

Technical Writing

Building Community

Thank you

  • Rich and Michael
  • The whole tiny-tools squad (Andrew, Hassan, Jeroen)
  • Another open source intern (Frances)
  • Isabel Z, Isabella V, Julia, Libby, Thomas & more who gave me feedback to build on
  • All my Donut meet and greeters