charliejhadley
  • Services
    • Coaching
    • Talks & Workshops
    • Dataviz
  • Training
    • R training
    • Data Ethics & AI
    • Data Science
  • Blog
  • About

Charlotte Jane Hadley
She/Her
charliejhadley
0000-0002-3039-6849

Hey! I’m Charlotte 🙋‍♀️

I’m a dataviz and data ethics evangelist, queer rights advocate and occassional Minecraft player. This is very much my personal website.

You’ll find my blog, training catalogue and consulting services.

In 2026 I launched my startup Visible Data where we’re building Pier, the human-first data communication workspace.

This website was built with Quarto because it’s amazing.


Visit the dedicated blog page for a more interactive experience.

Icon representing 'Understandable': the ability to interpret and make sense of data. A violin chart forms the shape of a lightbulb, combining a data visualisation with the symbol for insight.

Inspiration! A violin chart-like bulb

While designing Visible Data’s POUR-CAF iconograph I had the idea of making a violin chart in the shape of light bulb! Sounds like a fun project.

Jun 22, 2026
Charlotte Jane Hadley
5 min
Screenshot of pkgdown website highlighting the search results from the navbar search box are not keyboard navigable. This is achieved with an arrow pointing to the search results and the red text 'Not keyboard navigable'

Improving {pkgdown} search acessibility

Turns out the search results in pkgdown websites aren’t keyboard navigable which is an accessibility failure. I took a hot minute to fix that, and critique Claude along the way.

Jun 22, 2026
Charlotte Jane Hadley
3 min
YouTube thumbnail for the talk 'htmlwidgets Are a Secret Sauce in R – Can LLMs Make Them the Perfect Condiment?' showing Charlotte Hadley and Nic Crane.

My Shiny in Production 2025 talk is now on YouTube!

My joint talk with the amazing Nic Crane on using LLMs to build htmlwidgets is now live on Jumping Rivers’ YouTube channel.

Mar 4, 2026
Charlotte Jane Hadley
2 min
Elmo rise meme format showing Elmo superimposed on flames with his arms wide and the plotly company logo showing above.

Plotly abandoned R in 2025. Start 2026 thinking if it really is your best choice.

Plotly isn’t magic, it’s powered by {htmlwidgets} which unlocks a vast universe of interactive dataviz with over 133 packages! Consider if you should move beyond Plotly.

Jan 5, 2026
Charlotte Jane Hadley
16 min
Choropleth showing which countries drive on the left (shaded red) and which drive on the right (shaded green).

UX and dataviz should talk more

There’s a lot more that UX and dataviz should talk about, especially affordances for common interaction elements.

Dec 30, 2025
Charlotte Jane Hadley
3 min
Procedural art showing smooth curved lines arranged to appear similar to the elemental stones from the movie Fifth Element.

Curves and stones

Recreating the elemental stones with {ggplot2}

Dec 29, 2025
Charlotte Jane Hadley
13 min
Annotated ggplot2 code demonstrating the difference between dataviz-level and geom-specific aesthetics.

{ggplot2}’s two level aesthetics: dataviz or geom-specific

It’s the aesthetics that power {ggplot2} but there are two different levels of aes(), dataviz level and geom-specific.

Dec 18, 2025
Charlotte Jane Hadley
6 min
Screenshot of the code do.call(hc_xAxis, c(list(hc_marital_bar_chart), list_hc_xaxis_args) with the corresponding horizontal bar chart produced by highcharter.

Highcharts, do.call and c(list())

Getting around Error: All arguments must be named list, and why does do.call() want c(list(), list(…)) with htmlwidgets?

Dec 10, 2025
Charlotte Jane Hadley
4 min

Your year in ggplot2 with {ggplot2wrapped} 2025!

Merry Christmas! Visualise your year in geoms with Charlotte Hadley’s newly released package {ggplot2wrapped} and learn a quick story about Abstract Syntax Trees for parsing R code files.

Dec 1, 2025
5 min
Yellow hex sticker for the htmlwidgets R package, depicting a teal factory machine with R and JS logos producing interactive charts and maps on a conveyor belt.

7 Years in the Making: a htmlwidgets hex sticker!

Finally, after 7 years of complaining about htmlwidgets not having a hex sticker there is now an official hex sticker for the htmlwidgets package!

Oct 9, 2025
2 min

Which pch character do I need for {ggplot2}?

A visual reference for all 26 pch point shapes in ggplot2, showing which use outline colour, fill colour, or both.

May 25, 2022
3 min

30DayChartChallenge 2022: Food Pairing

Exploring cuisine ingredient patterns using a food pairing dataset — finding the most popular ingredients per cuisine and scoring recipes by how ‘typical’ their ingredient combinations are.

Apr 20, 2022
2 min

30DayChartChallenge 2022-04-03: Historical

Recreating the Wikipedia hemline (skirt height) overview chart using digitised coordinates and {ggalt}’s xspline smoothing.

Apr 20, 2022
6 min

30DayChartChallenge 2022-04-05: Slopes

Visualising the aspect ratios of the contiguous US states as slopes in a geo-faceted chart.

Apr 7, 2022
3 min

30DayChartChallenge 2022-04-02: Pictogram

Using emoji as pictogram dots in a standard deviation histogram — a slightly chaotic entry for the Pictogram day of #30DayChartChallenge 2022.

Apr 1, 2022
4 min

30DayChartChallenge 2022-04-01: Part to Whole

Exploring waffle charts with the Bechdel Test dataset — overall proportions, by decade, and with {cowplot} layouts.

Mar 31, 2022
5 min

Advent calendars in March

Rehousing an old script for making animated advent calendars with {ggplot2}.

Mar 30, 2022
6 min

The first 5mins with survey data

How do you spend your first 5 minutes with survey data? A standardised workflow using {readr} and {janitor} demonstrated with Kaggle’s 2020 Machine Learning & Data Science survey.

Dec 14, 2020
3 min

New RStudio projects directly from Spotlight

Do you want a way to quickly create and launch new RStudio projects directly from Spotlight, all saved in a sensible location? Automator has your back.

May 15, 2020
2 min

The Office: Who’s who?

Using {tidytext} and logistic regression to classify Jim vs Dwight dialogue from The Office, inspired by Julia Silge’s tidy text classification tutorial.

Dec 16, 2019
3 min

juxtaposer: Development diary

A running development diary for the {juxtaposer} package, covering usethis setup, initial htmlwidgets scaffolding, and file structure decisions.

Nov 8, 2019
1 min

juxtaposer: use cases and feature requirements

Use cases and MoSCoW feature requirements for the {juxtaposer} htmlwidget package, which wraps JuxtaposeJS for R.

Oct 11, 2019
3 min

Package (development) announcement: juxtaposer

Announcing {juxtaposer} — an {htmlwidget} package for embedding JuxtaposeJS image comparison tools into RMarkdown documents and {shiny} apps.

Oct 11, 2019
3 min

JuxtaposeJS gotchas

Collating gotchas in the JuxtaposeJS JavaScript library that will affect how the {juxtaposer} htmlwidget package is constructed.

Oct 11, 2019
3 min

Things we learned in September 2019

A monthly recap covering {packup}, prefix notation for infix operators, {esquisse}, tidyr 1.0’s pivot functions, and Mara Averick’s hoist() animations.

Oct 1, 2019
3 min

tidyr 1.0: gather() and spread() are dead

tidyr 1.0 replaces gather() and spread() with pivot_longer() and pivot_wider() — here’s what that means for trainers and self-taught R users.

Sep 18, 2019
3 min

Prefix operators in R

Turns out there’s a neat trick to use R’s infix operators with prefix notation! Let’s demonstrate how…

Sep 11, 2019
2 min

Shiny modules to reduce duplication in apps

A practical introduction to Shiny modules via a World Development Indicators app — showing how modules reduce duplication when adding new tabs and controls.

Jul 9, 2019
2 min

Shiny Modules for useful controls

A practical tutorial on Shiny modules — building a moving-average timeseries app with the Online Labour Index data, first without modules, then refactoring to use them.

Mar 25, 2019
4 min

One weird regex matches 97% of DOI…

This one weird regex matches 97% of DOI — let’s wrap it into a tidy add_doi() function.

Mar 13, 2019
2 min

Where is the centre of University of Oxford?

University of Oxford has over 800 years of history to it, but if you want to organise a meeting at the centre of campus… where do you meet?

Feb 18, 2019
5 min

Keeping secrets in blogdown

Keeping API keys and passwords secret in a blogdown blog using the static/ folder and the secret package.

Jan 2, 2019
2 min

Using ggmap after July 2018

ggmap is an awesome package for creating maps with ggplot2. If you’re reading instructions written before July 2018 you will fail to replicate the results — here’s what changed and how to fix it.

Dec 5, 2018
2 min

Christmas Drinks ggplot2 Advent Calendar 2018

There are just about 24 Christmassy hot drinks available in the big UK cafes. I’ve made an advent calendar of them in ggplot2 — read this post to find out how to do the same.

Nov 28, 2018
7 min

Advent review 2018

A collection of R tips and tricks gathered over 2018 — from using {here} and Projects, to tidygraph, forcats, and accessibility.

Nov 27, 2018
1 min

Crawling DOI from a SAGE

Academic literature reviews are more than often tedious tasks, manually clicking through a journal’s history of volumes and issues. Not if you programmatically crawl the website with {rvest} and friends.

Nov 12, 2018
3 min

Great circles with sf and leaflet

Great circles are the shortest journeys between two points on a map, which can be easily computed and manipulated through the use of the excellent sf library, and visualised interactively with leaflet.

Feb 28, 2018
4 min

Crawling with tidygraph

In this blogpost I use crawling the internal links between pages in the University of Oxford’s Research Data website as an excuse for finally getting to grips with tidygraph and ggraph.

Feb 27, 2018
4 min

Recipes for learning

In this blogpost I introduce one of my favourite datasets, a treasure trove of 57,000+ recipes scraped from recipe websites for a fascinating research paper comparing how different cuisines choose ingredients. I first used this dataset in May 2015 to learn how to use R and continue to use it to test my understanding of new techniques and analysis.

Feb 18, 2018
4 min

Reproducible Blogposts

In this blogpost I introduce a rating system for the reproducibility of blogposts, taking authorship, data and code all into account. All blogposts include a star rating at both the top and bottom of the post with a link to (at least) the .Rmd file responsible for generating the page.

Feb 14, 2018
4 min

Checklists and style guides

A pre-publication checklist covering code style, data visualisation, and accessibility — the standards I try to follow for every blogpost.

Feb 9, 2018
4 min

Where’s the love for htmlwidgets?

If you’ve never heard of them, htmlwidgets are an amazing part of the work that RStudio (plus ramnathv and timelyportfolio) have undertaken to make R a beautiful tool for doing data science and communicating things about your data. Using leaflet, plotly, highcharter and more it’s possible to create rich interactive charts, maps and other visualisations directly from R without having to learn JavaScript

Feb 7, 2018
7 min
DOI logo, an orange circle enclosing the letters doi.

Gists, DOI and reproducible blogposts

Using GitHub Gists alongside DOI-issuing repositories to make blogposts and their associated data more reproducible and citable.

Feb 4, 2018
3 min
No matching items

    What I'm building

    • Visible Data
    • Pier

    My services

    • Training
    • Talks
    • Dataviz

    Things I like

    • Randall Munroe's XKCD
    • Rules of 3.
    • About Us
    • Branding

    Charlotte Jane Hadley

    Visible Data

    Founder of Visible Data.
    Unapologetically optimistic, data-driven and queer founder.

    © VizData Consulting Privacy Policy
     
    Cookie Preferences