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, I’ve now produced three livestream videos. What do you think? Do you watch them live or watch them later? Or are they too long? I’m looking for honest feedback! I have to admit that if I hadn’t livestreamed these videos, they would not have been produced. It’s nice that I can more or less record and post without any editing. This is still a bit of an experiment. I think fewer people are watching the episodes which makes me worry that this might be an overall step backwards for you...

Hey folks! Do you ever get that feeling where you’re scared to try something? But then you do it anyway… and it turns out way better than you expected? Well that was me on Wednesday morning. I ran my first livestream on YouTube recreating a ridgeline plot from Our World in Data showing the US baby boom. I wrote about it here in the newsletter back in May. The full session was about 2.5 hours. YouTube tells me that 272 people popped in at some point during the session. To be honest, I really...

Hey folks, I need your feedback on an idea! Don’t worry, there’s some visualization stuff at the bottom. I had a video nearly ready to post this week using a ridgeline plot to show the baby boom. I think I did a great job of recreating the plot. But through a series of unfortunate events, I lost the video. I actually recorded the video three times because my computer kept crashing as I was recording it. This was on top of increasing busyness on my part with teaching, proposal writing,...