library(tidyverse)AI-assisted plotting with R and Positron
Using GitHub Copilot integrated with Positron to improve your plots
1 Introduction
1.1 What we’ll cover
Developments in generative artificial intelligence (AI) using large language models (LLMs) is revolutizing the way the people code. We have covered in many past Code Clubs how to use ggplot2 in R to make the plots of your dreams, and today we are going to talk about aiding that process using AI.
By the end of the session, you should be more comfortable with using AI to aid in your plotting. Specifically, we’ll cover:
- The basics of
ggplot2syntax - Using AI to make a simple plot
- Using prompts to refine that plot more
- Prompting to make a much more complicated figure
Discussion
- Do you currently use AI to help with your plotting?
- If yes, how do you integrate AI into your workflow?
- Do you consider yourself familiar with the basics
ggplot2?
1.2 Before we start
We are going to be working in Positron for the rest of the semester. If you haven’t done so already, please:
Install Positron: download the appropriate installer from the download page, and run it. There are installers for Windows, macOS, and Linux.
Make sure you have a recent R (4.4.0 or higher) installed; Positron does not come with its own copy of R.
You should still be able to install Positron, just do so at the user level rather than system-wide.
On a Mac, this involves dragging the Positron app into your User Applications folder, /Users/<username>/Applications (i.e. this Applications folder is in the same parent folder as your Documents, Downloads, and Desktop folder).
On Windows, the Positron installer has a “User install” option. Look for a checkbox or dropdown labeled “Install for me only” (vs. “for all users”) during setup — that keeps the install in your user profile without needing admin rights.
2 Getting started
Go ahead and start Positron! It should look something like this:

2.1 Opening a folder (replaces RStudio Projects)
On the left side of the Positron window, you should see something similar to what’s shown in the screenshot on the right, prompting you to open a folder.
“Opening a folder” is Positron’s equivalent of opening an RStudio Project. The idea is the same: a folder is a self-contained workspace, and opening it sets your working directory and gives you a fresh R session.
But instead of requiring the special .Rproj file that is created when you make an RStudio Project, Positron simply treats any folder you open as a project.

Let’s open a new folder for today’s session:
You can use the folder you created last month when you learned about Positron from Jelmer, or you can create a new folder to use today. You can create it in any way, such as with your computer’s File Explorer / Finder.
I would suggest putting this folder within a folder for Code Club, for example:
Documents>codeclub>26-au(or put another way:~/Documents/codeclub/26-au). Again, it would be fine to use the same folder from our August session.Open this folder in Positron by clicking the Open Folder button shown above1.
Positron will reload and ask whether you want to trust the folder. Click Yes, I trust the authors and optionally check the box above it.

Why are Projects or open folders needed? These encourage good practices:
- Keep each research project in its own self-contained folder
- Use paths relative to the folder root, not absolute paths
- Avoid using
setwd()
They also make a lot of Positron’s features work better, such as the Explorer, Search, and version control support.
2.2 Setting up Positron to use GitHub Copilot with Posit Assistant
You can set up Posit Assistant to work with a variety of different LLMs. Today we will set it up for using GitHub Copilot.
The two main AI tools we have are:
- Code completions where you get AI suggested completions as you type
- Agentic chat using Posit Assistant where you can both get code suggestions and have the agent run the code for you.
2.2.1 Get a GitHub account if you don’t have one
In order to use GitHub Copilot with Posit Assistant, you must have a GitHub account.
Create a GitHub account by going to github.com/join.
- You will have to link to an email address. You can use your OSU email or a personal one, it doesn’t matter.
- You will have to pick a username. Some advice for picking a username:
- Incorporate your actual name - it’s useful for seeing who you are
- Pick a username you’d be comfortable with an employer seeing
- Shorter is better
- Recommend to use all lower case letters
- Your username can be changed but its annoying so try and get it right the first time
You can sign up for GitHub education with your OSU email by confirming your status as a student GitHub Education page.
Anyone with a GitHub account will be automatically enrolled in the free GitHub Copilot plan, which has a limit of 2,000 code completions per month and ~50 chat requests. That’s not enough for most people to use GitHub Copilot in a sustained way — but as students and teachers/faculty, we can get additional free access after applying for it. In summary (see also this GitHub page):
| Plan | Free for whom | How to get it | Code completions | Chat requests |
|---|---|---|---|---|
| Free | Everyone | Automatically | 2,000 per month | ~50 |
| Student | Students | Apply for education benefits | Unlimited | 200 |
| Pro | Teachers/Faculty | Apply for education benefits | Unlimited | 1,500 |
To apply for educational benefits, the following link will work for teachers/faculty and students alike — just select the appropriate option in the form:
Click “Start an application”:
Fill out the form as needed. (You will likely need a document that proves your current status at the university.)
2.2.2 Set your LLM provider to GitHub Copilot
In order to set up the Posit Assistant for AI-assisted plotting, you will need to configure the Posit Assistant extension. We will configure it to use GitHub Copilot.
Jelmer has created some intructions for how to set up Claude Code using your OSU LiteLLM API
To do that, call up your Command Palette (Cmd/Ctrl+Shift+P), and we are going to configure which LLMs our Posit Assistant can use. Type in “Authentication: Configure Language Model Providers” and select it.

This may be because:
- You have an old version of Positron installed. Go to the Positron site and download/install the newest version.
- You don’t have the Posit Assistant extension installed.
- Open the Extensions view in Positron by clicking the Extension icon in the Activity Bar (the narrow leftmost sidebar).
- In the search box, start typing “Posit Assistant”
- Click Install on the “Posit Assistant” extension by Posit Software, PBC.

This will prompt opening a new window where you can select which LLM provider you want to use. There are more options than what you can see in the screenshot below.

Today we are going to select GitHub Copilot, which is free to use for students and academics. You will need to have a GitHub account and sign in to GitHub Copilot. Go ahead and click the orange Connect Positron to GitHub Copilot. A new pop up with open that says “The extension ‘Authentication’ wants to sign in using GitHub. Click the blue Allow. This will open a new browser window where you can sign in to GitHub and authorize Posit Assistant to use GitHub Copilot.


Next you will get popup that includes a code for authenticating in your browser. You can click Copy & Continue to Browser and the 8 digit code will be added to your clipboard and a browser will open.

You will need to be logged into a GitHub account to do this - you can see that mine shows up below. You might also have the option here to log in.

Now you can authorize your device to use GitHub Copilot with Positron. Your code should be ready in your clipboard, you can paste it here using (Cmd/Ctrl+V)

Now you can authorize VS code to access items within your GitHub account. Yours might look different than mine depending on what groups you are involved with. You can press the green button to Authorize Visual-Studio-Code.

Now you should be connected.

While preparing the material for today’s session, I set up GitHub Copilot in Positron about 5 times. Sometimes when I would set up, I would get the pop up on the bottom right of my Positron window:

If you get this prompt, you can click the orange Yes. This will initiate a new popup that asks if you want to Continue to GitHub to create a Personal Access Token (PAT). You can click the blue Continue to GitHub.

You should next get a popup asking “Do you want Positron to open the external website?” and you can click the blue Open.

This will bring you to your GitHub account online where you can create a Personal Access Token (PAT). You can do this with all the defaults, and you will need to set an expiration date. GitHub recommends you set at 30 days but you can do longer. If you scroll to the bottom of hte page, you will find a green Generate token button - go ahead and click that.
Your PAT will then be created and you can see it. Be sure to copy this, and I like to save this token also in my password manager. Then you can navigate back to Postrion where there should be a prompt asking you for this PAT.

Paste your PAT and press Enter. You should now be connected to GitHub Copilot through Positron.
2.3 Starting an R session
Near the top-right corner of the Positron window is the so-called interpreter picker, which lets you choose which installation of R (or Python) to use for your session.
If Positron found your R installation, it may have started a session already — then it would look similar to what’s shown in the screenshot on the right (with the R version number corresponding to what you have installed).
3 Re-familiarizing ourself with ggplot2 syntax
Perhaps it is possible now to use AI to make your plots without understanding any ggplot2 or R syntax, but I do think it is much easier, and you’ll have a better time if you understand the basics.
3.1 Installing and loading the tidyverse
Before we start going through the syntactical basics, we need to have ggplot2 installed in R. If you were here last time, you’ll already have the tidyverse (and ggplot2 is one of the packages contain in this meta-package), but if you weren’t then you will need to first download it using install.packages(). Then you can load the tidyverse by calling it with the function library().
If you liked that output would be shown in the source editor, directly below code, like you might be used to in RStudio, you can enable inline output by turning on quarto.inlineOutput.enabled.
We are going to use the penguins dataset that comes preloaded with base R. If you want to see all of these datasets, you can run library(help = "datasets")
glimpse(datasets::penguins)Rows: 344
Columns: 8
$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Ad…
$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Tor…
$ bill_len <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, 42.0, …
$ bill_dep <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, 20.2, …
$ flipper_len <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186, 180,…
$ body_mass <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 4250, …
$ sex <fct> male, female, female, NA, female, male, female, male, NA, …
$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…
I am clipping below a bit of the []ggplot2 cheatsheet](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf) to see how the developesr explain the basis of plotting.

ggplot2 from the RStudio ggplot2 cheatsheetThe general syntax is like this:
data |> # start with dataframe and pipe to ggplot()
ggplot(aes(x = _x-variable_, # inside aes set variables mapped to visual aspects
y = _y-variable_,
color = _color-variable)) +
geom_*() + # add a geometry - the type of plot
scale_*() + # set how data maps to visual aspects
theme_*() + # adjust the overall look of the plot
labs() + # add labels - title, axes, legendYou can find the full ggplot2 cheatsheet also for reference.
4 Simple plots
Let’s start with with asking the Posit Assistant for help with a plot. Let’s ask for:
“Create a plot using the penguins dataset that plots flipper length versus bill length.”
When I did this for the first time, I got a pop up asking “Can Posit Assistant use executeCode?” This would mean that the Posit Assistant would like to actually run this code, versus just provide the code for me to run.

I am going to click Allow and see what happens. Alternatively you could click Deny and the Posit Assistant will provide you with code that you can copy and paste into your script or .qmd file to run.
When I do this, I get the following code, which I can see in my console:
library(ggplot2)
library(palmerpenguins)
Attaching package: 'palmerpenguins'
The following objects are masked from 'package:datasets':
penguins, penguins_raw
ggplot(penguins, aes(x = bill_length_mm, y = flipper_length_mm)) +
geom_point()Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

There are a few things to note here, Posit AI has:
- loaded the packages it needs to run the code its specified.
- decided that the data we want is in the package
palmerpenguinseven though I was expecting it to pull from the base Rpenguinsdataset. This is fine, but it is something to be aware of as these two datasets are not identical. For example, the variable names inpalmerpenguins::penguinsare different than indatasets::penguins. - not used the pipe
|>operator which is a more modern way to write code that is considered best practice. This approach is fine but it is something to be aware of.
While this is a very good start, let’s see if different prompting can get us a different result. I am now going to ask for:
“Create a plot using the penguins dataset embedded in base R that plots flipper length versus bill length. Use the pipe operator and add code annotations so I can follow what each line is doing.”
When I do this, I get the following code:
# Load the penguins dataset from datasets package
datasets::penguins |>
# Extract the columns we need for plotting
(\(d) data.frame(
bill_length = d$bill_length_mm,
flipper_length = d$flipper_length_mm
))() |>
# Remove rows with missing values
(\(d) d[complete.cases(d), ])() |>
# Create the plot with bill_length on x-axis and flipper_length on y-axis
with(plot(
x = bill_length,
y = flipper_length,
main = "Penguin Measurements",
xlab = "Bill Length (mm)",
ylab = "Flipper Length (mm)",
pch = 19,
col = rgb(0, 0, 0, 0.6)
))This code has a number of problems, is actually worse than my first attempt, and does not work for me at all. I notice a few problems:
- I asked for the
penguinsdataset which is a part of base R, and Posit AI has given me a fully base R plot, which is not what I want. I can change my prompt to fix this problem. - Because the assistant thinks I want a base R plot, this leads to addition code which is fully not necessary. There are some steps that aim to extract the columns from the data, which is needed for base R plotting, but this is also done incorrectly. The code we’ve received is (trying) to extract
bill_length_mmandflipper_length_mmfrompenguinsbut those are not the correct variable names.
Let’s try a new prompt:
“Create a plot using the data datasets::penguins using ggplot2 that plots flipper length versus bill length. Use the pipe operator and add code annotations so I can follow what each line is doing.”
Now I get this code:
library(ggplot2)
# Load the penguins dataset from the datasets package
datasets::penguins |>
# Initialize ggplot with bill_length_mm on x-axis and flipper_length_mm on y-axis
ggplot(aes(x = bill_length_mm, y = flipper_length_mm)) +
# Add a scatter plot layer with semi-transparent points
geom_point(alpha = 0.6, size = 3) +
# Add labels for the axes and title
labs(
title = "Penguin Measurements",
x = "Bill Length (mm)",
y = "Flipper Length (mm)"
)Better but still I have the wrong variable names. What if I try and give the prompt information about my dataset? I am going to paste the output of glimpse(datasets::penguins) into the end of my prompt such that the AI can see exactly what my data looks like.
Create a plot using the data datasets::penguins using ggplot2 that plots flipper length versus bill length. Use the pipe operator and add code annotations so I can follow what each line is doing. I am pasting below the output of glimpse(datasets::penguins) so you can see what the data looks like.
glimpse(datasets::penguins)Rows: 344
Columns: 8
$ species <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Ad…
$ island <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgersen, Tor…
$ bill_len <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, 42.0, …
$ bill_dep <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, 20.2, …
$ flipper_len <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186, 180,…
$ body_mass <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, 4250, …
$ sex <fct> male, female, female, NA, female, male, female, male, NA, …
$ year <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…
Ok now I am getting a functional plot:
library(ggplot2)
# Load the penguins dataset from the datasets package
datasets::penguins |>
# Initialize ggplot with bill_len on x-axis and flipper_len on y-axis
ggplot(aes(x = bill_len, y = flipper_len)) +
# Add a scatter plot layer with semi-transparent points
geom_point(alpha = 0.6, size = 3) +
# Add labels for the axes and title
labs(
title = "Penguin Measurements",
x = "Bill Length (mm)",
y = "Flipper Length (mm)"
)Warning: Removed 2 rows containing missing values or values outside the scale range
(`geom_point()`).

I have gotten a little bit more than I asked for - Posit AI decided that the points should be better (size = 3) and be a bit transparent (alpha = 0.6) which I think is ok. I also have gotten x- and y-axis labels along with a title even though I didn’t ask for that.
4.1 Exercise: Try it yourself
Try on your own to prompt Posit AI to make you a new plot with this same data. Play around and then we will all share our experiences.
What have you learned about what makes a successful prompt?
5 More complicated plots/involved requests
We’ve done some simple plots but what if we want to make something much more complicated? We could think about this in two ways:
- We could ask for a much more customized plot
- We could see how well we think Posit AI can select a visualization tool without providing that information explicitly.
Let’s pick a more involved dataset, one we’ve used in Code Club before to have more variables to interrogate. The data we are going to download can be found here, though I have saved the file, added it to our Code Club Github, and included some code below for you to download it.
download.file(
url = "https://github.com/osu-codeclub/osu-codeclub.github.io/raw/refs/heads/main/posts/S08E01_wrangling_01/data/factbook.csv",
destfile = "factbook_download.csv"
)Let’s see if we can get Posit AI to read the data in for us. I am going to start with a minimal prompt so we can see how that goes:
“Read in factbook_download.csv”.
Posit AI gave me the following message:

factbook <- read.csv("posts/S12E02_plotting_01/factbook_download.csv")
factbookLet’s look at this data, using glimpse() (to get a summary).
glimpse(factbook)Rows: 11,072
Columns: 20
$ Series.Name <chr> "Population, total", "Population, total", "Population, …
$ Series.Code <chr> "SP.POP.TOTL", "SP.POP.TOTL", "SP.POP.TOTL", "SP.POP.TO…
$ Country.Name <chr> "Afghanistan", "Albania", "Algeria", "American Samoa", …
$ Country.Code <chr> "AFG", "ALB", "DZA", "ASM", "AND", "AGO", "ATG", "ARG",…
$ X2000..YR2000. <chr> "19542982", "3089027", "30774621", "58230", "66097", "1…
$ X2001..YR2001. <chr> "19688632", "3060173", "31200985", "58324", "67820", "1…
$ X2002..YR2002. <chr> "21000256", "3051010", "31624696", "58177", "70849", "1…
$ X2003..YR2003. <chr> "22645130", "3039616", "32055883", "57941", "73907", "1…
$ X2004..YR2004. <chr> "23553551", "3026939", "32510186", "57626", "76933", "1…
$ X2005..YR2005. <chr> "24411191", "3011487", "32956690", "57254", "79826", "1…
$ X2006..YR2006. <chr> "25442944", "2992547", "33435080", "56837", "80221", "2…
$ X2007..YR2007. <chr> "25903301", "2970017", "33983827", "56383", "78168", "2…
$ X2008..YR2008. <chr> "26427199", "2947314", "34569592", "55891", "76055", "2…
$ X2009..YR2009. <chr> "27385307", "2927519", "35196037", "55366", "73852", "2…
$ X2010..YR2010. <chr> "28189672", "2913021", "35856344", "54849", "71519", "2…
$ X2011..YR2011. <chr> "29249157", "2905195", "36543541", "54310", "70567", "2…
$ X2012..YR2012. <chr> "30466479", "2900401", "37260563", "53691", "71013", "2…
$ X2013..YR2013. <chr> "31541209", "2895092", "38000626", "52995", "71367", "2…
$ X2014..YR2014. <chr> "32716210", "2889104", "38760168", "52217", "71621", "2…
$ X2015..YR2015. <chr> "33753499", "2880703", "39543154", "51368", "71746", "2…
We have some problems here:
- All data is read in as characters, even those that aren’t of the type
character - Since R by default doesn’t allow column names to start with a number, an
Xhas been added to the beginning of all columns that begin with a number.
Let’s see if we can get Posit AI to help us fix this. I am going to prompt:
“Read in factbook_download.csv. The first four columns should be character type and the rest of the columns are numeric. I want the year columns to start just with the number of the year, with no X preceeding.”

This is the output I get - and this code doesn’t work for me.
factbook <- read.csv(
"factbook_download.csv",
check.names = FALSE,
stringsAsFactors = FALSE,
na.strings = c("", ".."),
colClasses = c(
rep("character", 4),
rep("numeric", 16)
)
)In my Quarto document, I have a “Fix” option - and I’m going to try that and see how it works.

We get the following code, which runs. Let’s look at the message and then we can look at the data to see how it all went.
factbook <- read.csv(
"factbook_download.csv",
check.names = FALSE,
stringsAsFactors = FALSE,
na.strings = c("", ".."),
colClasses = c(
rep("character", 4),
rep("numeric", 16)
)
)The message we get is:

glimpse(factbook)Rows: 11,072
Columns: 20
$ `Series Name` <chr> "Population, total", "Population, total", "Population,…
$ `Series Code` <chr> "SP.POP.TOTL", "SP.POP.TOTL", "SP.POP.TOTL", "SP.POP.T…
$ `Country Name` <chr> "Afghanistan", "Albania", "Algeria", "American Samoa",…
$ `Country Code` <chr> "AFG", "ALB", "DZA", "ASM", "AND", "AGO", "ATG", "ARG"…
$ `2000 [YR2000]` <dbl> 19542982, 3089027, 30774621, 58230, 66097, 16394062, 7…
$ `2001 [YR2001]` <dbl> 19688632, 3060173, 31200985, 58324, 67820, 16941587, 7…
$ `2002 [YR2002]` <dbl> 21000256, 3051010, 31624696, 58177, 70849, 17516139, 7…
$ `2003 [YR2003]` <dbl> 22645130, 3039616, 32055883, 57941, 73907, 18124342, 7…
$ `2004 [YR2004]` <dbl> 23553551, 3026939, 32510186, 57626, 76933, 18771125, 7…
$ `2005 [YR2005]` <dbl> 24411191, 3011487, 32956690, 57254, 79826, 19450959, 7…
$ `2006 [YR2006]` <dbl> 25442944, 2992547, 33435080, 56837, 80221, 20162340, 8…
$ `2007 [YR2007]` <dbl> 25903301, 2970017, 33983827, 56383, 78168, 20909684, 8…
$ `2008 [YR2008]` <dbl> 26427199, 2947314, 34569592, 55891, 76055, 21691522, 8…
$ `2009 [YR2009]` <dbl> 27385307, 2927519, 35196037, 55366, 73852, 22507674, 8…
$ `2010 [YR2010]` <dbl> 28189672, 2913021, 35856344, 54849, 71519, 23364185, 8…
$ `2011 [YR2011]` <dbl> 29249157, 2905195, 36543541, 54310, 70567, 24259111, 8…
$ `2012 [YR2012]` <dbl> 30466479, 2900401, 37260563, 53691, 71013, 25188292, 8…
$ `2013 [YR2013]` <dbl> 31541209, 2895092, 38000626, 52995, 71367, 26147002, 8…
$ `2014 [YR2014]` <dbl> 32716210, 2889104, 38760168, 52217, 71621, 27128337, 8…
$ `2015 [YR2015]` <dbl> 33753499, 2880703, 39543154, 51368, 71746, 28127721, 8…
I am an experienced R user, if I was going to read in this data, I would just have used the code below – all of our issues are stemming from the fact that missing values are denoted with a non-standard notation of “..”. I can just pass to read_csv() that the missing values are denoted with “..” and it will read in the data correctly.
factbook_jess <- read_csv("factbook_download.csv",
na = c("", ".."))Rows: 11072 Columns: 20
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (4): Series Name, Series Code, Country Name, Country Code
dbl (16): 2000 [YR2000], 2001 [YR2001], 2002 [YR2002], 2003 [YR2003], 2004 [...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(factbook_jess)Rows: 11,072
Columns: 20
$ `Series Name` <chr> "Population, total", "Population, total", "Population,…
$ `Series Code` <chr> "SP.POP.TOTL", "SP.POP.TOTL", "SP.POP.TOTL", "SP.POP.T…
$ `Country Name` <chr> "Afghanistan", "Albania", "Algeria", "American Samoa",…
$ `Country Code` <chr> "AFG", "ALB", "DZA", "ASM", "AND", "AGO", "ATG", "ARG"…
$ `2000 [YR2000]` <dbl> 19542982, 3089027, 30774621, 58230, 66097, 16394062, 7…
$ `2001 [YR2001]` <dbl> 19688632, 3060173, 31200985, 58324, 67820, 16941587, 7…
$ `2002 [YR2002]` <dbl> 21000256, 3051010, 31624696, 58177, 70849, 17516139, 7…
$ `2003 [YR2003]` <dbl> 22645130, 3039616, 32055883, 57941, 73907, 18124342, 7…
$ `2004 [YR2004]` <dbl> 23553551, 3026939, 32510186, 57626, 76933, 18771125, 7…
$ `2005 [YR2005]` <dbl> 24411191, 3011487, 32956690, 57254, 79826, 19450959, 7…
$ `2006 [YR2006]` <dbl> 25442944, 2992547, 33435080, 56837, 80221, 20162340, 8…
$ `2007 [YR2007]` <dbl> 25903301, 2970017, 33983827, 56383, 78168, 20909684, 8…
$ `2008 [YR2008]` <dbl> 26427199, 2947314, 34569592, 55891, 76055, 21691522, 8…
$ `2009 [YR2009]` <dbl> 27385307, 2927519, 35196037, 55366, 73852, 22507674, 8…
$ `2010 [YR2010]` <dbl> 28189672, 2913021, 35856344, 54849, 71519, 23364185, 8…
$ `2011 [YR2011]` <dbl> 29249157, 2905195, 36543541, 54310, 70567, 24259111, 8…
$ `2012 [YR2012]` <dbl> 30466479, 2900401, 37260563, 53691, 71013, 25188292, 8…
$ `2013 [YR2013]` <dbl> 31541209, 2895092, 38000626, 52995, 71367, 26147002, 8…
$ `2014 [YR2014]` <dbl> 32716210, 2889104, 38760168, 52217, 71621, 27128337, 8…
$ `2015 [YR2015]` <dbl> 33753499, 2880703, 39543154, 51368, 71746, 28127721, 8…
Ok, now that we have data read in - let’s play around with prompting for an interesting and progressingly more complicated plot. Let’s do this together.
Footnotes
Or if that’s somehow not showing, by using the menu
File>Open Folder....↩︎