ggplot2 has four main components
theme() function which allows you to override the default theme elements by calling element functionsThere are around 40 unique elements that control the appearance of the plot. They can be roughly grouped into five categories: plot, axis, legend, panel and facet.
We will actively modify the base graph as we progress
library(ggplot2)
df <- data.frame(x = 1:3, y = 1:3, z = LETTERS[1:3])
base <- ggplot(df, aes(x, y)) + geom_point(size = 4)
Both these elements are usually modifidied with setter function element_rect. Plot title and panel grid lines wqill be modified with element_text and element_line which I describe below when I discuss axes.
The syntax for element_rect looks like this:
element_rect(fill = NULL, colour = NULL, size = NULL, linetype = NULL,
color = NULL, inherit.blank = FALSE)
The options color and size pertain to the border around the rectangle.
base + theme(plot.background = element_rect(fill = "lightblue"))
base + theme(panel.background = element_rect(fill = "lightblue"))
base + theme(plot.background = element_rect(fill = "pink")) +
theme(panel.background = element_rect(fill = "lightblue"))
Let’s put a dark border around the plot
base + theme(plot.background = element_rect(fill = "pink", color = "black", size = 3)) +
theme(panel.background = element_rect(fill = "lightblue"))
Change the linetype
base + theme(plot.background = element_rect(fill = "pink", color = "black", size = 3, linetype = "dashed")) +
theme(panel.background = element_rect(fill = "lightblue"))
You can change the way the dashes appear
base + theme(plot.background = element_rect(fill = "pink", color = "black", size = 1, linetype = "2112")) +
theme(panel.background = element_rect(fill = "lightblue"))
You can adjust the major and minor gridlines with element_line function
base + theme(panel.grid.major = element_line(color = "blue", size = 2, linetype = "dashed"))
base + theme(panel.grid.minor = element_line(color = "blue", size = 2, linetype = "dashed"))
For many professional applications it is important to set the aspect ratio of the panel so that the graph looks the same no matter where you print it. Flexible aspect ratio may lead to unnecessary stretching or compressing of axes.
base + theme(aspect.ratio = 1)
Axes have two commonly used setter functions: element_text and element_line
The first is used for modifying all sort of axis text including axis title and tick text. The latter is used for the axis and tick lines.
The synatx for the two functions is as follows:
element_text(family = NULL, face = NULL, colour = NULL, size = NULL,
hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL,
color = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE)
element_line(colour = NULL, size = NULL, linetype = NULL,
lineend = NULL, color = NULL, arrow = NULL, inherit.blank = FALSE)
# where arrow describes the arrow head with the function arrow() with the following syntax
arrow(angle = 30, length = unit(0.25, "inches"),
ends = "last", type = "open")
The default ggplot2 doesn’t have a line with arrow on the X or Y axis. Let’s put it there.
base + theme(axis.line = element_line(arrow = arrow(angle = 15, length = unit(.15,"inches"),type = "closed")))
Modify axis ticks
base + theme(axis.ticks = element_line(color = "red"),
axis.ticks.length = unit(10, units = "pt"),
axis.text = element_text(face = "bold", family = "Josefin Slab", size = 12, angle = 30))
base + geom_point(aes(color = z), size = 4) +
theme(legend.key = element_blank(),
legend.background = element_blank(),
legend.title.align = 1,
legend.position = c(0.9,0.5))
facet_wrap and facet_gridWe will agin use the mpg2 data set
mpg2 <- subset(mpg, cyl != 5 & drv %in% c("4", "f") & class != "2seater")
ggplot(mpg2, aes(displ,hwy)) +
geom_point() +
facet_wrap(~class) +
theme(strip.background = element_blank()) +
theme(strip.text = element_text(family = "Times")) +
theme(panel.spacing.x = unit(1,"cm"), panel.spacing.y = unit(1.5,"cm"))
Get ggthemes and cowplot and play with the themes
ggplot2 has its own inbuilt ggsave function that we will use
# vector graphics
ggsave("plot01_20170628.svg")
ggsave("plot01_20170628.pdf")
# raster graphics
ggsave("plot01_20170628.png")