Because airquality is a pre-built dataset, we can write it to our data directory to store it for later use.
The source for this dataset is the New York State Department of Conservation and the National Weather Service of 1973 for five months from May to September recorded daily.
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
Load the dataset into your global environment
data("airquality")
Look at the structure of the data
The function, head, will only display the first 6 rows of the dataset. Notice in the global environment to the right, there are 153 observations (rows).
See how Month has changed to have characters instead of numbers.
summary(airquality$Month)
Length Class Mode
153 character character
Month is a categorical variable with different levels, called factors.
This is one way to reorder the Months so they do not default to alphabetical (you will see another way to reorder DIRECTLY in the chunk that creates the plot below in Plot 1).
Here is a first attempt at viewing a histogram of temperature by the months May through September. We will see that temperatures increase over these months. The median temperature appears to be about 75 degrees.
Reorder the legend so that it is not the default (alphabetical), but rather in chronological order.
fill = Month colors the histogram by months between May - Sept.
scale_fill_discrete(name = “Month”…) provides the month names on the right side as a legend.
p1 <- airquality |>ggplot(aes(x=Temp, fill=Month)) +geom_histogram(position="identity")+scale_fill_discrete(name ="Month", labels =c("May", "June","July", "August", "September")) +labs(x ="Monthly Temperatures from May - Sept", y ="Frequency of Temps",title ="Histogram of Monthly Temperatures from May - Sept, 1973",caption ="New York State Department of Conservation and the National Weather Service") #provide the data sourcep1
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Is this plot useful in answering questions about monthly temperature values?
Plot 2: Improve the histogram using ggplot
Outline the bars in white using the color = “white” command.
Use alpha to add some transparency (values between 0 and 1).
Change the binwidth.
Histogram of Average Temperature by Month
Add some transparency and white borders around the histogram bars. Here July stands out for having high frequency of 85 degree temperatures. The dark purple color indicates overlaps of months due to the transparency.
p2 <- airquality |>ggplot(aes(x=Temp, fill=Month)) +geom_histogram(position="identity", alpha=0.66, binwidth =3, color ="black")+scale_fill_discrete(name ="Month", labels =c("May", "June","July", "August", "September")) +labs(x ="Monthly Temperatures from May - Sept", y ="Frequency of Temps",title ="Histogram of Monthly Temperatures from May - Sept, 1973",caption ="New York State Department of Conservation and the National Weather Service")p2
Did this improve the readability of the plot?
Plot 3: Create side-by-side boxplots categorized by Month
We can see that August has the highest temperatures based on the boxplot distribution.
p3 <- airquality |>ggplot(aes(Month, Temp, fill = Month)) +labs(x ="Months from May through September", y ="Temperatures", title ="Side-by-Side Boxplot of Monthly Temperatures",caption ="New York State Department of Conservation and the National Weather Service") +geom_boxplot() +scale_fill_discrete(name ="Month", labels =c("May", "June","July", "August", "September"))p3
Notice that the points above and below the boxplots in June and July are outliers.
Plot 4: Make the same side-by-side boxplots, but in grey-scale
Use the scale_fill_grey command for the grey-scale legend, and again, use fill=Month in the aesthetics.
Side by Side Boxplots in Gray Scale
Here we just changed the color palette to gray scale using scale_fill_grey.
p4 <- airquality |>ggplot(aes(Month, Temp, fill = Month)) +labs(x ="Monthly Temperatures", y ="Temperatures", title ="Side-by-Side Boxplot of Monthly Temperatures",caption ="New York State Department of Conservation and the National Weather Service") +geom_boxplot()+scale_fill_grey(name ="Month", labels =c("May", "June","July", "August", "September"))p4
Plot 5: Now make one new plot on your own, that is meaningfully different from the 4 I have shown you.
Scatterplot of Temperature vs. Ozone
ggplot(data = airquality,mapping =aes(x =Temp, y =Ozone)) +geom_point(mapping =aes(color = Month)) +geom_smooth(method ="lm") +labs(title ="Relationship Between Ozone and Temperature",subtitle ="Measurements from May to September 1973",x ="Temperature (Degrees Fahrenheit)",y ="Ozone (Air Quality)")
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 37 rows containing non-finite outside the scale range
(`stat_smooth()`).
Warning: Removed 37 rows containing missing values or values outside the scale range
(`geom_point()`).
I’ve created a scatterplot of the relationship between daily temperature (in degrees Fahrenheit) and daily ozone (in air quality scale measurement). This plot shows temperature plotted on the x-axis against ozone on the y-axis. After indicating the data and variables in question, I used geom_point() to plot the data, adding color to each data point to indicate which month each measurement was taken. To get an idea of the strength of the relationship between the two variables, I added a line to approximate its linear model using geom_smooth(), specifying “lm” for the model. The plot indicates that in general, as temperatures rose, so too did the measure of ozone. Although the relationship between temperature and ozone is by-and-large positive, there is a considerable degree of variance in results, including several significant outliers. Looking at the colors of the data points, the same can be said of the relationship between time and ozone: increasingly higher ozone levels are measured as spring turned to summer, and gradually drop as cooling began in September.