Two ways to plot a dumpster fire


Hey folks,

I’m really excited to be offering a 1-day (6 hours) data visualization workshop on May 9th. It will cover the basics of ggplot2. If you’ve been following along this newsletter for anytime, you know I’ve thought a lot about how we learn. A critical element of learning is to create a mental model that we can hang ideas on to flesh out our understanding of a concept. The “grammar of graphics” is one such mental model for building plots. It is instantiated in ggplot2 - that’s the “gg” in the name! My goal is to help you develop that mental model so that you can leave the workshop understanding the ggplot2 framework and add to your understanding of the model as you go off on your own journey learning more advanced topics. You can learn more and register by clicking the button below. Feel free to email me if you have any questions.

Let me know if you’d like to see other one or part day workshops offered related to the types of things I discuss in the newsletter or over on YouTube.


I’ve been swamped the last couple of weeks with a variety of things. This is keeping me from my regular posting of videos to YouTube - sorry! I do plan on getting back on track soon. However, I may be limited to one a week rather than the recent two a week cadence. I have too many things that are falling by the side that I need to get caught back up before putting more effort into the channel. Hopefully, you’ll understand.


If you’re like many of us in the US, we’ve been getting whiplash trying to understand the current status of the tariff war, why it’s happening, and what the effects are. This has been quite the week for the Trump administration which seems to be trying to one up itself each week with things it can do to be unpredictable.

I’ve been struck by a few of the visualizations coming out of the New York Times describing the impact of the administrations policies on the US and international stock markets. Here are two visuals they posted in an article last week:

I’ll focus on the first plot and encourage you to think through the second on your own - they’re somewhat related. The first is a line plot showing the closing value of the S&P 500, a barometer of the 500 leading companies on the US stock exchange. There are breaks in the lines indicating the weekends and holidays. Each week’s worth of data has a shaded rectangle in the background that is colored by whether the week ended lower than the previous week.

So how would I pull this off? I see three major components: the data, the lines, and the rectangles.

To get the data, I would use the {quantmod} package. This package has a function called getSymbols() that allows you to give it a vector of stock symbols returning time series data for those symbols. For example, quantmod::getSymbols("^GSPC", auto.assign = FALSE, from = "2025-01-01") will get you the values of the S&P 500 going back to the start of the year. I would use the same approach to get the data for the other countries’ markets included in the second plot. To convert from a time series object to a data frame or tibble, we should be able to use as.data.frame() or as_tibble(). One hiccup with as_tibble() is that we’d have to find the argument to convert the rownames to a column. If you’re interested in stock price data, I’d encourage you to play around with this package. You can get intradata data at the one-minute interval!

To generate the line plot with dots and breaks for weekends and holidays there are two strategies I’d consider. Normally, geom_line() will draw a line connecting all points, unless there’s an NA value for one of the x-axis values or if there is grouping data. We could insert NA values for dates corresponding to each weekend and holiday. I could easily do this for weekends using lubridate::wday(). But I think it would be hard (for me) to remember all the holidays when the markets are closed. Instead, I think I’ll use lubridate:week(), lubridate:isoweek(), or lubridate:epiweek() to get the week of the year. Then I could map that value to the group aesthetic in ggplot(). This should put breaks in between each line.

To generate the shaded background, I’d use geom_rect(). For each week in the data, I’d need to tell geom_rect() the xmin, xmax, ymin, and ymax values. The xmin and xmax, I’d get by grouping the dates by the week and returning the minimum and maximum values using summarize(). I’ll likely look to see if there’s a {lubridate} function that allows me to give the year, the week, and the day of the week and get back a date. That would be handy. I’d then set ymin and ymax to be the limits on the y-axis. For each week, I’d want to get the closing value at the end of each week. Again, I could get this with the summarize() function. With that data, I’d see whether the Friday close is higher or lower than the previous week and then map that logical variable to the fill color.

I think the data, the lines, and the rectangles are the big parts of the plot to figure out. Other things would include: (1) the horizontal grid lines running on top of the rectangles, but behind the lines; (2) commas in the y-axis values; (3) placement of the month below the first date of the month and returning data every two weeks; and (4) getting “Orange bars” to be orange and bolded in the subtitle. If you’ve been following along over the past few months you likely have an idea for how we can do each of these.

Don’t forget to give the second plot the same treatment! What do you think the hard parts are in that plot?

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!

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, Earlier this week, those of us in the US celebrated Memorial Day. For many, this marks the unofficial start of summer. I suppose the clock is now ticking until Labor Day, which is the unofficial end of summer. Let me be the jerk to tell you that you have 100 days left to accomplish all of your summer goals. I suspect that for many of you writing papers and putting together conference posters and talks are on your list of goals. Generating attractive visualizations of your data is...

Hey folks, I’ve been getting asked to give more talks about data visualization and my experiences critiquing visualization. It’s been a lot of fun to engage with live audiences. I enjoy learning about their experiences, motivations, and limitations. As much as I love this newsletter and the content I post to YouTube, it’s clear that it isn’t a substitute to talking to people without the filter of email or a chat box. So, if you’re interested in working with me on an individual or group level...

Hey folks, The more I peruse the literature, the more I see that researchers need help designing figures to help tell their stories. I don’t just mean the mechanics of creating a figure in R, Python, Prism, or Excel. Rather, if someone had a box of dry erase markers of various colors and they had to give a talk without any slides, what would they draw to tell their story? I don’t mean to trivialize the difficulties. It’s hard! There are many figures I’ve published that I wish I could have a...