Annotating heat maps to highlight effects of fentanyl overdoses using the ggplot2 R package


Hey folks,

I really hope you enjoyed the series of newsletters and videos of me recreating the visualizations presented by W.E.B. DuBois at the 1900 Paris Exposition. I can’t express how much I enjoyed making them. Some of them were pretty tricky and required a lot of work. But I think it was worth it! It definitely forced me to use some new-to-me tools like geom_polygon() and geom_sf(). Please let me know what you thought of the series! I wonder if there’d be any interest in a companion to the Battle-Baptiste & Rusert book on the visuals that showed how to make each of them in R. Email me back and let me know.

This week, I want to highlight a story in the NY Times’s “TheUpshot” section from December 2024, “How Drug Overdose Deaths Have Plagued One Generation of Black Men for Decades”. The story describes how drug overdoses has had a disproportionate effect on Black men through the 1980s, 1990s, and now - these men are all from the same generation. One quote that stood out to me in the article was from Tracie Gardner, who said, “They were resilient enough to live through a bunch of other epidemics — H.I.V., crack, Covid, multi-drug-resistant tuberculosis — only to be killed by fentanyl.” Oof.

In this article, the team of journalists and data scientists present heatmaps for different diseases with the year across the x-axis, the age across the y-axis, and the intensity of each cell colored by the number of deaths per 100,000 people. They make plots for different diseases and U.S. cities. Here’s the heatmap for drug deaths among Black men in Chicago:

A few things stand out to me about this figure that I’d enjoy taking on in R with ggplot2.

First, it’s obviously a heatmap. I need to aggregate the data from the mortality data from NCHS, but let’s assume that we can get a CSV or TSV with columns for the year, age, and number of deaths in each region. We should be able to map the year to the y, age to the x, and deaths to the fill aesthetics. Then we’d use geom_tile() to create the heatmap.

Second, I’m intrigued that they also included the dashed lines indicating the ages of a cohort of men born between 1951 and 1970 across the last 40 years. I’d likely create this using geom_abline(). This function allows us to create lines with specified slopes and y-intercepts. Of course, we’d want to use a “long dash” line type to match what is used in this visual.

Third, the legend is a gradient going from a pale color to a dark purple color. This is reminiscent of one of the viridis color scales. Even if it isn’t exactly one of the built-in color scales, we could use scale_fill_gradient() to define a gradient between the range of colors. Beyond the color, the legend is interesting because it has vertical grid lines at 200, 400, and 600 deaths per 100k. It’s also justified to the right side of the heatmap.

Fourth, there’s no x-axis title, but there is a y-axis title - “AGE”. It’s rotated 90 degrees and located outside the top let corner of the heatmap. I’d likely put that there with some axis.title.y manipulation or using annotate(geom = "text"). I could go either way, but I think annotate() might be cleaner. The annotate() function would be useful for placing the “Men born from ….” text to the heatmap.

Finally, the plot has a title and caption. The title has two font faces - bold and regular sans serif font. Likely a Libre Franklin-related font that we can get from google fonts. The caption at the bottom is small and gray.

What else catches your eye about this visual? Let me know!

Reading the comments of a NY Times article is rarely a good idea. But nestled in there are other plots that I’d be interested in seeing. For example, what do the data look like for Black women? Hispanics? Whites? What do they look like in Detroit? How do you think we’d need to alter the R code to look at these questions and compare them to Black men? I suspect the WONDER NCHS Data is a treasure trove for answering these and other questions.

Workshops

I'm pleased to be able to offer you one of three recent workshops! With each you'll get access to 18 hours of video content, my code, and other materials. Click the buttons below to learn more

In case you missed it…

Here is a livestream that I published this week that relate to previous content from these newsletters. Enjoy!

video previewvideo preview

Finally, if you would like to support the Riffomonas project financially, please consider becoming a patron through Patreon! There are multiple tiers and fun gifts for each. By no means do I expect people to become patrons, but if you need to be asked, there you go :)

I’ll talk to you more next week!

Pat

Riffomonas Professional Development

Read more from Riffomonas Professional Development

Hey folks! I’m appreciating the positive feedback on Monday critique videos. They’re a lot of fun to think through and make. I think I might start looking at figures that are drawn from the scientific literature since many of you found out about me from my science work. Let me know if there are plots or practices that you’d like to see me talk about. I’ll see if I can work them into the queue. Also, if you’re working on developing figures for a presentation, poster, or paper and would like to...

Hey folks! I continue to get positive feedback about my critique videos. This has me quite excited that I’ve perhaps scratched an itch that people have been struggling with. Would you like to meet with a group of other people who are committed to making their data visualizations better? I’m forming groups now that would meet once a week or every other week to give each other constructive feedback on the visualizations they are making for their work. Alternatively, if you have ever thought, “I...

Hey folks! I posted two videos last week! On Monday I posted a video critiquing the diverging bar plot that I described in this newsletter last Friday. My goal in this video was to think through a “constructive” approach to interpreting and critiquing data visualizations. As scientists, I think we are too worried about hurting each other’s feelings. So we don’t critique each other. At the same time, many of us think before we speak and can come off overly harsh. My goal is to create a...