# 2 Package ggplot2

An elegant modern graphic method based on Wilkinson's Grammar of Graphics

## 2.1 Maps:

### 2.1.1 Polygon

library(ggplot2)
require(maps) 
## Loading required package: maps
portugal = map_data('world', region = 'Portugal')
ggplot(portugal, aes(x = long, y = lat, group = group)) +
geom_polygon(fill = 'white', colour = 'black') ## 2.2 Path, ribbon and rectangles.

h <- ggplot(economics, aes(date, unemploy))
# Path
h + geom_path() # Ribbon
h + geom_ribbon(aes(ymin = unemploy-900, ymax = unemploy+900), fill = "steelblue") + geom_path(size = 0.8) # Rectangle
h + geom_rect(aes(xmin = as.Date('1980-01-01'), ymin = -Inf, xmax = as.Date('1985-01-01'), ymax = Inf), fill = "steelblue") + geom_path(size = 0.8) ### 2.2.1 Add line segments between points (x1, y1) and (x2, y2):

#### 2.2.1.1 Create a scatter plot

i <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
# Add segment
i + geom_segment(aes(x = 2, y = 15, xend = 3, yend = 15)) # Add arrow require(grid)
i + geom_segment(aes(x = 5, y = 30, xend = 3.5, yend = 25), arrow = arrow(length = unit(0.5, "cm"))) #### 2.2.1.2 Add curves between points (x1, y1) and (x2, y2):

i + geom_curve(aes(x = 2, y = 15, xend = 3, yend = 15)) ## 2.3 Graphical parameters:

### 2.3.1 Convert the variable dose from numeric to factor variable

ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x=dose, y=len))
p+ geom_boxplot() ### 2.3.2 Default plot

print(p) ### 2.3.3 Change title and axis labels

p1 <- p +labs(title="Plot of length \n by dose", x ="Dose (mg)", y = "Teeth length")
p1 ### 2.3.4 Change the appearance of labels

p1 + theme( plot.title = element_text(color="violet", size=14, face="bold.italic"), axis.title.x = element_text(color="blue", size=14, face="bold"), axis.title.y = element_text(color="blue", size=14, face="bold") ) # Hide labels
p1 + theme(plot.title = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank()) ### 2.3.5 Default plot

p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose))+ geom_boxplot()
p # Modify legend titles
p + labs(fill = "Dose (mg)") ## 2.4 Legend position and appearance

### 2.4.1 Convert the variable dose from numeric to factor variable

ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose))+
geom_boxplot()

### 2.4.2 Change legend position: "left","top", "right", "bottom", "none"

p + theme(legend.position="top") ### 2.4.3 Remove legends

p + theme(legend.position = "none") # Change the appearance of legend title and labels
p + theme(legend.title = element_text(colour="darkgreen"), legend.text = element_text(colour="red")) # Change legend box background color
p + theme(legend.background = element_rect(fill="violet")) ### 2.4.4 Change the order of legend items

p + scale_x_discrete(limits=c("2", "0.5", "1")) # Set legend title and labels
p + scale_fill_discrete(name = "Dose", labels = c("A", "B", "C")) ### 2.4.5 Convert dose and cyl columns from numeric to factor variables

ToothGrowth$dose <- as.factor(ToothGrowth$dose)
mtcars$cyl <- as.factor(mtcars$cyl)

### 2.4.6 Box plot and scatterplot

bp <- ggplot(ToothGrowth, aes(x=dose, y=len))
# Scatter plot
sp <- ggplot(mtcars, aes(x=wt, y=mpg))
bp + geom_boxplot(fill='steelblue', color="violet") # scatter plot
sp + geom_point(color='darkblue') ### 2.4.7 Box plot

bp <- bp + geom_boxplot(aes(fill = dose))
bp ### 2.4.8 Scatter plot

sp <- sp + geom_point(aes(color = cyl))
sp ## 2.5 Color by qsec values

sp2<-ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(color = qsec))
sp2 ## 2.6 Change the low and high colors Sequential color scheme

sp2+scale_color_gradient(low="blue", high="red") ## 2.7 Diverging color scheme

mid<-mean(mtcars$qsec) sp2+scale_color_gradient2(midpoint=mid, low="blue", mid="white", high="red", space = "Lab" ) ## 2.8 Point shapes, colors and size knitr::include_graphics("shapes.png") ## 2.9 Convert cyl as factor variable mtcars$cyl <- as.factor(mtcars$cyl) ### 2.9.1 Basic scatter plot ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(shape = 18, color = "steelblue", size = 4) ### 2.9.2 Change point shapes and colors by groups ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(shape = cyl, color = cyl)) ### 2.9.3 Change colors and shapes manually ggplot(mtcars, aes(x=wt, y=mpg, group=cyl)) + geom_point(aes(shape=cyl, color=cyl), size=2)+ scale_shape_manual(values=c(3, 16, 17))+ scale_color_manual(values=c('#999999','#E69F00', '#56B4E9'))+ theme(legend.position="top") ### 2.9.4 Add text annotations to a graph set.seed(1234) df <- mtcars[sample(1:nrow(mtcars), 10), ] df$cyl <- as.factor(df$cyl) ### 2.9.5 Line types knitr::include_graphics("lines.png") ## 2.10 Basic line plot ### 2.10.1 Create some data df <- data.frame(time=c("breakfeast", "Lunch", "Dinner"), bill=c(10, 30, 15)) head(df) ## time bill ## 1 breakfeast 10 ## 2 Lunch 30 ## 3 Dinner 15 ### 2.10.2 Basic line plot with points Change the line type ggplot(data=df, aes(x=time, y=bill, group=1)) + geom_line(linetype = "dashed")+ geom_point() ## 2.11 Line plots with multiple groups ### 2.11.1 Create some data df2 <- data.frame(sex = rep(c("Female", "Male"), each=3), time=c("breakfeast", "Lunch", "Dinner"), bill=c(10, 30, 15, 13, 40, 17) ) head(df2, n=3) ## sex time bill ## 1 Female breakfeast 10 ## 2 Female Lunch 30 ## 3 Female Dinner 15 ### 2.11.2 Change line types and colors by groups (sex) ggplot(df2, aes(x=time, y=bill, group=sex)) + geom_line(aes(linetype = sex, color = sex))+ geom_point(aes(color=sex))+ theme(legend.position="top") ## 2.12 Change line types, colors and sizes ggplot(df2, aes(x=time, y=bill, group=sex)) + geom_line(aes(linetype=sex, color=sex, size=sex))+ geom_point()+ scale_linetype_manual(values=c("twodash", "dotted"))+ scale_color_manual(values=c('#999999','#E69F00'))+ scale_size_manual(values=c(1, 1.5))+ theme(legend.position="top") ## 2.13 Themes and background colors ### 2.13.1 Convert the column dose from numeric to factor variable ToothGrowth$dose <- as.factor(ToothGrowth$dose) #Create a box plot p <- ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot() ## 2.14 Change plot themes p + theme_gray(base_size = 14) p + theme_bw() p + theme_linedraw() p + theme_light() p + theme_minimal() p + theme_classic() ## 2.15 Axis limits: Minimum and Maximum values p <- ggplot(cars, aes(x = speed, y = dist)) + geom_point() ### 2.15.1 Different functions are available for setting axis limits: ## 2.16 Default plot print(p) ## Change axis limits using coord_cartesian() p + coord_cartesian(xlim =c(5, 20), ylim = c(0, 50)) # Use xlim() and ylim() p + xlim(5, 20) + ylim(0, 50)  ## Warning: Removed 19 rows containing missing values (geom_point). # Expand limits p + expand_limits(x = c(5, 50), y = c(0, 150)) ## 2.17 Axis transformations: log and sqrt scales ### 2.17.1 Create a scatter plot: p <- ggplot(cars, aes(x = speed, y = dist)) + geom_point() ## 2.18 Log transformation using scale_xx() # possible values for trans : 'log2', 'log10','sqrt' p + scale_x_continuous(trans='log2') + scale_y_continuous(trans='log2') ## 2.19 Format axis tick mark labels require(scales) ## Loading required package: scales ## ## Attaching package: 'scales' ## The following object is masked from 'package:readr': ## ## col_factor p + scale_y_continuous(trans = log2_trans(), breaks = trans_breaks("log2", function(x) 2^x), labels = trans_format("log2", math_format(2^.x))) # Reverse coordinates p + scale_y_reverse() ## 2.20 Axis ticks: customize tick marks and labels, reorder and select items ### 2.20.1 Create a box plot: p <- ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot()  ## 2.21 Change the style and the orientation angle of axis tick labels face can be "plain", "italic", "bold" or "bold.italic" p + theme(axis.text.x = element_text(face="bold", color="#993333", size=14, angle=45), axis.text.y = element_text(face="bold", color="blue", size=14, angle=45)) # Remove axis ticks and tick mark labels p + theme( axis.text.x = element_blank(), # Remove x axis tick labels axis.text.y = element_blank(), # Remove y axis tick labels axis.ticks = element_blank()) # Remove ticks ## Customize continuous and discrete axes: ### Discrete axes: ### 2.21.1 Change x axis label and the order of items p + scale_x_discrete(name ="Dose (mg)", limits=c("2","1","0.5")) ### 2.21.2 Change tick mark labels p + scale_x_discrete(breaks=c("0.5","1","2"), labels=c("Dose 0.5", "Dose 1", "Dose 2")) ### 2.21.3 Choose which items to display p + scale_x_discrete(limits=c("0.5", "2")) ### 2.21.4 Continuous axes: ### 2.21.5 Default scatter plot sp <- ggplot(cars, aes(x = speed, y = dist)) + geom_point() sp ## 2.22 Customize the plot ### 2.22.1 1. Change x and y axis labels, and limits sp <- sp + scale_x_continuous(name="Speed of cars", limits=c(0, 30)) + scale_y_continuous(name="Stopping distance", limits=c(0, 150))  ### 2.22.2 2. Set tick marks on y axis: a tick mark is shown on every 50 sp + scale_y_continuous(breaks=seq(0, 150, 50))  ## Scale for 'y' is already present. Adding another scale for 'y', which ## will replace the existing scale. ### 2.22.3 Format the labels require(scales) sp + scale_y_continuous(labels = percent) # labels as percents ## Scale for 'y' is already present. Adding another scale for 'y', which ## will replace the existing scale. ## 2.23 Add straight lines to a plot: horizontal, vertical and regression lines ### 2.23.1 Simple scatter plot sp <- ggplot(data=mtcars, aes(x=wt, y=mpg)) + geom_point() ### 2.23.2 Add straight lines ### 2.23.3 Add horizontal line at y = 2O; change line type and color sp + geom_hline(yintercept=20, linetype="dashed", color = "red") ## 2.24 Add vertical line at x = 3; change line type, color and size sp + geom_vline(xintercept = 3, color = "blue", size=1.5) ## 2.25 Add regression line sp + geom_abline(intercept = 37, slope = -5, color="blue")+ ggtitle("y = -5X + 37") ## 2.26 Add horizontal line segment sp + geom_segment(aes(x = 2, y = 15, xend = 3, yend = 15)) ## 2.27 My Data Example Water samples were collected on 6/6/18, 9/24/18, 12/17/18, 1/26/19 and ran on an autoanalyzer to determine NO3-N, NH4-N, PO4, and Chl-a concentrations across 8 water tanks identified by treatments (control "A" or nutrient enriched "N"). Moreover this data was used in my master's thesis. Research was conducted at LSU wetland observation greenhouses in Baton Rouge, LA. ### 2.27.1 Location map LA_counties <- map_data("county", "louisiana") %>% select(lon = long, lat, group, id = subregion) head(LA_counties, n=3) ## lon lat group id ## 1 -92.61863 30.48136 1 acadia ## 2 -92.48685 30.48709 1 acadia ## 3 -92.48685 30.48709 1 acadia ggplot(LA_counties, aes(lon, lat)) + geom_point(size = .25, show.legend = FALSE) + coord_quickmap() ggplot(LA_counties, aes(lon, lat, group = group )) + geom_polygon(fill = "white", colour = "grey50") + geom_point(data = LA_counties, mapping = aes(x = -91.1828669024795, y = 30.4114813833709), colour = "red") + coord_sf() Here I made a map that contains the geolocation of our wetland observation greenhouses using ggplot. library(readr) Porewater_data <- read_csv("~/Desktop/R folder/Bookdown/Porewater_data.csv") head(Porewater_data, n=3) ## # A tibble: 3 x 7 ## Tank Date NO3 (uM) NH4 (uM) PO4 (uM) Conc of chl (ug/… Nutrient ## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <chr> ## 1 1 6/6/18 2.07 1.35 3.08 2.77 A ## 2 2 6/6/18 4.68 2.48 2.45 5.3 N ## 3 3 6/6/18 3.05 1.77 4.62 2.99 A Here I read the porewater dataset in and headed the first three lines ### 2.27.2 Scatter plot ggplot(Porewater_data, aes(x=Conc of chl (ug/L), y=NH4 (uM), group=Nutrient)) + geom_point(aes(shape=Nutrient, color=Nutrient), size=2)+ theme_classic()+ theme(legend.background = element_rect(fill="gray"))+ geom_hline(yintercept=2, linetype="dashed", color = "black")+ geom_abline()+ scale_shape_manual(values=c(3, 16))+ scale_color_manual(values=c('red','blue')) From the porewater dataset, I set x as concentration of chl and y as NH4 and grouped them by nutrients. I then distinguished the nutrient treatments using geom_point, which made them different schapes. I removed the lined background using the theme_classic argument. I added a mid-line and abline using the geom_hline and geom_abline argument respectively. I then manually changed the treatment colors to blue and red. ### 2.27.3 Scatterplot by date SamplePoint<-factor(Porewater_data$Date, levels = c("6/6/18", "9/24/18", "12/17/18", "1/26/19"))
ggplot(Porewater_data, aes(x=SamplePoint, y=NH4 (uM), group=Nutrient)) + geom_point(aes(shape=Nutrient, color=Nutrient), size=2)+ scale_shape_manual(values=c(3, 16))+ scale_color_manual(values=c('red','blue')) First I made the dates a factor in the porewater dataset in order so they would be distributed simillarly in any future graphs, and named it Sample Point. I replace concentration of chl with Sample point for x, removed the theme, abline and halfline. This data show the scatter distribution of NH4 as it relates to nutrient treatment over 4 time points.

### 2.27.4 Boxplot

ggplot(Porewater_data, aes(x=SamplePoint, y=NH4 (uM), fill=Nutrient))+ geom_boxplot()  + theme_classic()+ labs(fill = "Treatment")+ theme(legend.background = element_rect(fill="gray"))` I used the same data construction as above but here I created a boxplot using geom_boxplot. I once again removed the background noise using theme_classic and changed the legend title to treatment. I would most likely use this figure to describe any interaction.