Load library tidyverse in order to access dplyr and ggplot2
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
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.
Load the dataset into your global environment
Because airquality is a pre-built dataset, we can write it to our data directory to store it for later use.
data("airquality")
Look at the structure of the data
In the global environment, click on the row with the airquality dataset and it will take you to a “spreadsheet” view of the data.
View the data using the “head” function
The function, head, will only disply the first 6 rows of the dataset. Notice in the global environment to the right, there are 153 observations (rows)
Notice that all the variables are classified as either integers or continuous values.
Calculate Summary Statistics
If you want to look at specific statistics, here are some variations on coding. Here are 2 different ways to calculate “mean.”
mean(airquality$Temp)
[1] 77.88235
mean(airquality[,4])
[1] 77.88235
For the second way to calculate the mean, the matrix [row,column] is looking for column #4, which is the Temp column and we use all rows.
Calculate Median, Standard Deviation, and Variance
median(airquality$Temp)
[1] 79
sd(airquality$Wind)
[1] 3.523001
var(airquality$Wind)
[1] 12.41154
Rename the Months from number to names
Sometimes we prefer the months to be numerical, but here, we need them as the month names. There are MANY ways to do this. Here is one way to convert numbers 5 - 9 to May through September
See how Month has changed to have characters instead of numbers (it is now classified as “character” rather than “integer”)
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.
(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 in chronological order. This is a different way to order than what was shown above.
(labs) allows us to add a title, axes labels, and a caption for the data source
Plot 1 Code
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 source
Plot 1 Output
p1
`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 of Average Temperature by Month
Outline the bars in white using the color = “white” command
Use alpha to add some transparency (values between 0 and 1)
Change the binwidth
Add some transparency and white borders around the histogram bars.
Plot 2 Code
p2 <- airquality |>ggplot(aes(x=Temp, fill=Month)) +geom_histogram(position="identity", alpha=0.5, binwidth =5, color ="white")+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")
Plot 2 Output
Here July stands out for having high frequency of 85 degree temperatures. The dark purple color indicates overlaps of months due to the transparency.
Did this improve the readability of the plot?
p2
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"))
Plot 3
p3
Notice that the points above and below the boxplots in June and July are outliers.
Plot 4: Side by Side Boxplots in Gray Scale
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.
Plot 4 Code
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"))
Plot 4
p4
Plot 5: Scatterplot of Solar Radiation and Ozone Levels by Month.
Now make one new plot on your own, that is meaningfully different from the 4 I have shown you. You can select any of the variables in this dataset. Be sure to explore the dataset to see which variables are included that we have not explored yet. You may create a scatterplot, histogram, boxplot, or something else. Be sure to include a title, axes labels, and caption for the datasource in your Plot 5. Then finally, below your chunk of code for your plot 5, ….
Plot 5 Output
p5 <- airquality |>ggplot(aes(x = Solar.R, y = Ozone, color= Month)) +geom_point(alpha =0.8, size =3, na.rm=TRUE) +geom_smooth(method="lm", color ="black", na.rm=TRUE)+scale_color_discrete(name ="Month", labels =c("May", "June", "July", "August", "September")) +labs(x ="Solar Radiation", y ="Ozone Levels", title ="Scatterplot of Solar Radiation vs.Ozone Levels by Month",caption ="New York State Department of Conservation and the National Weather Service")p5
`geom_smooth()` using formula = 'y ~ x'
Write a brief essay here
Describe the plot type you have created
Any insights that the plot shows
Describe any special code you used to make this plot
I created a scatterplot that visualizes the relationship between solar radiation (Solar.R) and ozone levels (Ozone), with data points color coded by month. I added a linear regression trend line to identify the overall trend in the relationship.
The scatterplot shows that these two variables could have a positive correlation, because when solar radiation increases, ozone levels tend to increase as well. This make sense since ozone is produced through photochemical reactions triggered by UV radiation from the sun.
I used color to differentiate months allows us to observe seasonal trends, which could help explain the positive relationship between solar radiation and ozone levels. Since the dataset includes data from May to September, which corresponds to the spring and summer seasons, we expect higher sunlight exposure during these months.
Although there is a trend, we cannot solely explain radiation levels by ozone levels, since there are other factors (such as wind, humidity, pollution) that could also influence ozone levels.
I ran some new codes to create the P5 plot. I used geom_point() to create a scatterplot because I wanted to visualize the relationship between Solar Radiation and Ozone levels.As we saw in class, I adjusted the transparency using alpha so that overlapping points would be easier to see. I changed the point size with size to make the plot more readable. I included na.rm = TRUE to remove missing values (NAs).
I also used geom_smooth(method = “lm”) which Adds a trend line using linear regression (lm). This helps visualize the relationship between the two variables. The trend line is black for contrast and better visibility. Finally, I Set the color palette for the scatterplot points based on the Month variable scale_color_discrete()*. Instead of fill, I used color, which is appropriate for scatterplots (since fill is used for areas like bars or boxplots).