The 30 Day Chart Challenge is a data visualisation challenge organised by Cédric Scherer and Dominic Royé. Participants make one chart each day of the challenge, inspired by the daily prompt. The prompts are also split across 5 different categories, which for 2025 were comparisons, distributions, relationships, time series, and uncertainties.
I first participated in the 2022 edition of the challenge, and wrote a blog post about what I learned during the process. This year was the first time I managed to complete all 30 days since 2022, so I decided to write another blog post to do the same this year.
If you’re more into maps than charts, you might be interested in the 30 Day Map Challenge which takes place in November each year.
Although I hadn’t fully committed myself to doing every day of the challenge at the start, I still thought it would be useful to think about what I wanted to get out of it. Having some aims for the month really helps when things get busy, and making more charts for fun doesn’t seem like much of a priority.
My main aims for the challenge were:
As I worked through the prompts, I also decided I wanted to use it as a way to design more experimental charts – those that fall outside of the standard chart types, and may or may not be very effective.
I found some prompts much easier than others in terms of coming up with an idea for a chart. And so I ended up working on the prompts in a different order. For example, the day 29 chart was one of the first plots I created.
I also didn’t do one chart per day, I tended to batch them together. e.g. creating a trio of plots using the same software, and same chart styling for three different prompts.
For day 1 of the challenge, I chose to use data from Our World in Data on income inequality represented by the share of income received by the richest 1% of the population. I chose this dataset because I thought it would work well for the Fractions prompt. After the first day, I decided to continue using this dataset for all of the prompts. Since one of my goals was to save time searching for data and re-use datasets, what better way to do that than force myself to create 30 charts for one dataset?
A couple of the prompts were Data prompts, so I did end up using another couple of datasets during the challenge. Although for those prompts, I visualised them alongside the income inequality data. On day 24, I used World Health Organization data on access to basic hand-washing facilities and again compared the trend of time with the trend in income inequality. I used data on the availability of dairy products in the USA, and compared the trend over time to the income inequality trend in the USA. I added a third dataset to this chart, via the presidential dataset in {ggplot2} in R, to add some additional context in the background of the time series data.
Finally, for the Birds prompt, I was really struggling to figure out how income inequality data could fit that prompt, and eventually decided to use some data on bird populations to create a dual axis line chart, in the style of spurious correlations.
I used four different tools for building charts: R, Python, Observable, and D3.
Although most were still made in R, in comparison to previous editions, this is my lowest percentage of R-created charts. That mainly reflects my goal of learning more Observable and D3. I probably use Observable as much as I’d planned, but that’s because something finally clicked in my head about how D3 works, and I was having more fun playing with it instead.
Most of my R charts were built with {ggplot2}, but I did also use this as an opportunity to try out the (reasonably new) {tidyplots} package. I really like how clean and tidy the default chart aesthetics are, and love how it still works so seamlessly with existing {ggplot2} functions and extension packages.
I won’t go into detail about all 30 of the charts I created, but I will highlight the one I like the most, and the one I’d like to remake.
This isn’t the most complex, or intricately designed chart but I really like it for two reasons:
This (horrendous) chart was created for the Extraterrestrial prompt, which I interpreted as *a chart designed by an extraterrestrial who has never heard of good data visualisation principles”. This one was designed deliberately badly, and I’d love to do a step-by-step walk through of how to make it better. Perhaps a future blog post will do just that.
You can browse all of the charts that I’ve made for this year and previous editions of the 30 Day Chart Challenge, using an interactive app built with Shinylive.
You can also find the source code on GitHub.
In terms of programming and technical learning, some of the highlights are:
Observable:
Some of the things I’ve learned about Observable are written down in my Observable for R users blog post.
D3:
Python:
R:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
save_js_png <- function(day, selector, ...) { httpuv::runStaticServer( dir = glue::glue("2025/scripts/day_{day}/"), port = 4000, background = TRUE, browse = FALSE ) webshot2::webshot( url = "http://127.0.0.1:4000/", file = glue::glue("2025/viz/day_{day}.png"), selector = selector, ... ) httpuv::stopAllServers() } |
The image is then saved in the right folder with a standardised name by simply calling:
1 |
save_js_png(day = 26, selector = "svg") |
Some of the things I’d love to work on next:
If you’re thinking about participating in a chart challenge (whether the 30 Day Chart Challenge or a different one), here are a couple of things I’d recommend:
I saw so many beautiful and interesting charts throughout the challenge, and it would be impossible to mention them all here, but these were a few of my particular favourites:
#30DayChartChallenge: Fractions
![]()
I've tracked my daily mood and activities for more than 1,500 days. These are my moods visualized. An empty circle was a terrible day, while a full circle was a fantastic day.
— Jacque Schrag (@jacqueschrag.com) 2 April 2025 at 02:39
[image or embed]
#30DayChartChallenge Day 9. diverging #xfiles #dataviz
— Ihar Yanouski (@iharyanouski.bsky.social) 10 April 2025 at 13:27
[image or embed]
Well done to everyone who participated in this year’s challenge whether you made one or thirty charts!