15  Customize

Author

Jarad Niemi

R Code Button

With any graphic in R, including a ggplot2 graphics, you are able to customize every aspect of the graphic. Here we will introduce some of the most commonly used customization options in ggplot2.

library("tidyverse")
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     
── 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

To investigate different customization options, we will utilize the warpbreaks data set. Here is a default plot using these data:

# Warpbreaks default plot
g <- ggplot(warpbreaks, 
            aes(x     = tension, 
                y     = breaks,
                color = wool,
                shape = wool)) +
  geom_jitter(
    height = 0,
    width  = 0.1
  )

g

So that we don’t have to copy-paste all the code plot every time, we saved the plot into the object g. This will allow us to add layers and customization by using g +.

15.1 Themes

Themes provide a different overall look of the graphic. There are a variety of built-in themes that can be accessed very quickly.

# Some built-in themes
g + theme_bw()

g + theme_light()

g + theme_dark()

g + theme_minimal()

The default theme can be changed in a given R session using theme_set(). Let’s set the theme_bw() as the default theme for this session.

# Set the default theme
theme_set(theme_bw())

15.2 Legend

The legend can quickly be removed or moved.

# Remove legend
g + theme(legend.position = "none")

# Legend on bottom
g + theme(legend.position = "bottom")

The legend can also be put inside the plot using x and y axis offsets, i.e. values between 0 and 1 that indicate, as a proportion of the x and y axis, where the legend should be located.

# Put legend inside the plot
g + theme(legend.position = c(
  0.9, # x offset in (0,1) 
  0.8  # y offset in (0,1)
))

By default, the legend will be centered on the coordinates provided in legend.position.

# Put top right corner of legend at desired coordinates
g + theme(
  legend.position      = c(0.9, 0.8),
  
  # put top right corner on coordinates
  legend.justification = c(1,   1))   

The legend justification can be utilized to quickly put a plot in a corner of the plotting area by setting the legend.position and legend.justification

# Put legend in the top right
g + theme(
  legend.position      = c(1, 1),
  legend.justification = c(1, 1))

15.3 Labels

Labels can be modified in (at least) two ways: 1) adding the labs() function or 2) modifying the underlying data.

# Change labels using labs()
g + labs(
  # Use aes() values
  x     = "Tension",
  y     = "Breaks",
  color = "Wool",
  shape = "Wool",
  
  # Add a title
  title    = "Title",
  subtitle = "Subtitle",
  
  # Caption
  caption  = "Caption",
  tag      = "Tag"
)

For those variables listed in aes(), you can change the underlying data.

# Change labels in data
d <- warpbreaks |>
  rename(
    Wool                = "wool",
    Tension             = "tension",
    
    # Use backticks when including characters 
    # not allowed in variable names
    `Number of Breaks`  = "breaks"
  )

ggplot(d, 
       aes(
         x = Tension,
         y = `Number of Breaks`, # use backticks with invalid variable names
         color = Wool,
         shape = Wool
       )) +
  geom_jitter(width = 0.1, height = 0)

15.4 Ticks

To modify the labels on ticks, you can change the labels in the plot.

# Change tick labels in plot
g + 
  scale_x_discrete(
    # Change label
    name = "Tension",
    
    # Change tick label
    labels = c(
      "L" = "Low",
      "M" = "Medium",
      "H" = "High"
    ))

Alternatively, you can change the underlying data.

# Change tick labels in underlying data
d <- warpbreaks |>
  mutate(tension = fct_recode(tension,
    Low    = "L",
    Medium = "M",
    High   = "H"
  ))

ggplot(d, 
       aes(
         x     = tension,
         y     = breaks,
         color = wool,
         shape = wool
       )) +
  geom_jitter(width = 0.1, height = 0)

You can also change the values on numeric axes which also changes the grid line locations.

# Change tick locations for numeric variables
g + scale_y_continuous(
  name   = "Number of Breaks", # 
  breaks = c(30, 50),          # `breaks` is an argument of the function, not the warpbreaks variable name
  limits = c(0, 70))            # we can also set limits using this function

15.5 Colors

Colors can be set for fill and color aesthetics. There are (at least) three ways to set colors. The first is to use preset names.

# Show all color names
colors()
  [1] "white"                "aliceblue"            "antiquewhite"        
  [4] "antiquewhite1"        "antiquewhite2"        "antiquewhite3"       
  [7] "antiquewhite4"        "aquamarine"           "aquamarine1"         
 [10] "aquamarine2"          "aquamarine3"          "aquamarine4"         
 [13] "azure"                "azure1"               "azure2"              
 [16] "azure3"               "azure4"               "beige"               
 [19] "bisque"               "bisque1"              "bisque2"             
 [22] "bisque3"              "bisque4"              "black"               
 [25] "blanchedalmond"       "blue"                 "blue1"               
 [28] "blue2"                "blue3"                "blue4"               
 [31] "blueviolet"           "brown"                "brown1"              
 [34] "brown2"               "brown3"               "brown4"              
 [37] "burlywood"            "burlywood1"           "burlywood2"          
 [40] "burlywood3"           "burlywood4"           "cadetblue"           
 [43] "cadetblue1"           "cadetblue2"           "cadetblue3"          
 [46] "cadetblue4"           "chartreuse"           "chartreuse1"         
 [49] "chartreuse2"          "chartreuse3"          "chartreuse4"         
 [52] "chocolate"            "chocolate1"           "chocolate2"          
 [55] "chocolate3"           "chocolate4"           "coral"               
 [58] "coral1"               "coral2"               "coral3"              
 [61] "coral4"               "cornflowerblue"       "cornsilk"            
 [64] "cornsilk1"            "cornsilk2"            "cornsilk3"           
 [67] "cornsilk4"            "cyan"                 "cyan1"               
 [70] "cyan2"                "cyan3"                "cyan4"               
 [73] "darkblue"             "darkcyan"             "darkgoldenrod"       
 [76] "darkgoldenrod1"       "darkgoldenrod2"       "darkgoldenrod3"      
 [79] "darkgoldenrod4"       "darkgray"             "darkgreen"           
 [82] "darkgrey"             "darkkhaki"            "darkmagenta"         
 [85] "darkolivegreen"       "darkolivegreen1"      "darkolivegreen2"     
 [88] "darkolivegreen3"      "darkolivegreen4"      "darkorange"          
 [91] "darkorange1"          "darkorange2"          "darkorange3"         
 [94] "darkorange4"          "darkorchid"           "darkorchid1"         
 [97] "darkorchid2"          "darkorchid3"          "darkorchid4"         
[100] "darkred"              "darksalmon"           "darkseagreen"        
[103] "darkseagreen1"        "darkseagreen2"        "darkseagreen3"       
[106] "darkseagreen4"        "darkslateblue"        "darkslategray"       
[109] "darkslategray1"       "darkslategray2"       "darkslategray3"      
[112] "darkslategray4"       "darkslategrey"        "darkturquoise"       
[115] "darkviolet"           "deeppink"             "deeppink1"           
[118] "deeppink2"            "deeppink3"            "deeppink4"           
[121] "deepskyblue"          "deepskyblue1"         "deepskyblue2"        
[124] "deepskyblue3"         "deepskyblue4"         "dimgray"             
[127] "dimgrey"              "dodgerblue"           "dodgerblue1"         
[130] "dodgerblue2"          "dodgerblue3"          "dodgerblue4"         
[133] "firebrick"            "firebrick1"           "firebrick2"          
[136] "firebrick3"           "firebrick4"           "floralwhite"         
[139] "forestgreen"          "gainsboro"            "ghostwhite"          
[142] "gold"                 "gold1"                "gold2"               
[145] "gold3"                "gold4"                "goldenrod"           
[148] "goldenrod1"           "goldenrod2"           "goldenrod3"          
[151] "goldenrod4"           "gray"                 "gray0"               
[154] "gray1"                "gray2"                "gray3"               
[157] "gray4"                "gray5"                "gray6"               
[160] "gray7"                "gray8"                "gray9"               
[163] "gray10"               "gray11"               "gray12"              
[166] "gray13"               "gray14"               "gray15"              
[169] "gray16"               "gray17"               "gray18"              
[172] "gray19"               "gray20"               "gray21"              
[175] "gray22"               "gray23"               "gray24"              
[178] "gray25"               "gray26"               "gray27"              
[181] "gray28"               "gray29"               "gray30"              
[184] "gray31"               "gray32"               "gray33"              
[187] "gray34"               "gray35"               "gray36"              
[190] "gray37"               "gray38"               "gray39"              
[193] "gray40"               "gray41"               "gray42"              
[196] "gray43"               "gray44"               "gray45"              
[199] "gray46"               "gray47"               "gray48"              
[202] "gray49"               "gray50"               "gray51"              
[205] "gray52"               "gray53"               "gray54"              
[208] "gray55"               "gray56"               "gray57"              
[211] "gray58"               "gray59"               "gray60"              
[214] "gray61"               "gray62"               "gray63"              
[217] "gray64"               "gray65"               "gray66"              
[220] "gray67"               "gray68"               "gray69"              
[223] "gray70"               "gray71"               "gray72"              
[226] "gray73"               "gray74"               "gray75"              
[229] "gray76"               "gray77"               "gray78"              
[232] "gray79"               "gray80"               "gray81"              
[235] "gray82"               "gray83"               "gray84"              
[238] "gray85"               "gray86"               "gray87"              
[241] "gray88"               "gray89"               "gray90"              
[244] "gray91"               "gray92"               "gray93"              
[247] "gray94"               "gray95"               "gray96"              
[250] "gray97"               "gray98"               "gray99"              
[253] "gray100"              "green"                "green1"              
[256] "green2"               "green3"               "green4"              
[259] "greenyellow"          "grey"                 "grey0"               
[262] "grey1"                "grey2"                "grey3"               
[265] "grey4"                "grey5"                "grey6"               
[268] "grey7"                "grey8"                "grey9"               
[271] "grey10"               "grey11"               "grey12"              
[274] "grey13"               "grey14"               "grey15"              
[277] "grey16"               "grey17"               "grey18"              
[280] "grey19"               "grey20"               "grey21"              
[283] "grey22"               "grey23"               "grey24"              
[286] "grey25"               "grey26"               "grey27"              
[289] "grey28"               "grey29"               "grey30"              
[292] "grey31"               "grey32"               "grey33"              
[295] "grey34"               "grey35"               "grey36"              
[298] "grey37"               "grey38"               "grey39"              
[301] "grey40"               "grey41"               "grey42"              
[304] "grey43"               "grey44"               "grey45"              
[307] "grey46"               "grey47"               "grey48"              
[310] "grey49"               "grey50"               "grey51"              
[313] "grey52"               "grey53"               "grey54"              
[316] "grey55"               "grey56"               "grey57"              
[319] "grey58"               "grey59"               "grey60"              
[322] "grey61"               "grey62"               "grey63"              
[325] "grey64"               "grey65"               "grey66"              
[328] "grey67"               "grey68"               "grey69"              
[331] "grey70"               "grey71"               "grey72"              
[334] "grey73"               "grey74"               "grey75"              
[337] "grey76"               "grey77"               "grey78"              
[340] "grey79"               "grey80"               "grey81"              
[343] "grey82"               "grey83"               "grey84"              
[346] "grey85"               "grey86"               "grey87"              
[349] "grey88"               "grey89"               "grey90"              
[352] "grey91"               "grey92"               "grey93"              
[355] "grey94"               "grey95"               "grey96"              
[358] "grey97"               "grey98"               "grey99"              
[361] "grey100"              "honeydew"             "honeydew1"           
[364] "honeydew2"            "honeydew3"            "honeydew4"           
[367] "hotpink"              "hotpink1"             "hotpink2"            
[370] "hotpink3"             "hotpink4"             "indianred"           
[373] "indianred1"           "indianred2"           "indianred3"          
[376] "indianred4"           "ivory"                "ivory1"              
[379] "ivory2"               "ivory3"               "ivory4"              
[382] "khaki"                "khaki1"               "khaki2"              
[385] "khaki3"               "khaki4"               "lavender"            
[388] "lavenderblush"        "lavenderblush1"       "lavenderblush2"      
[391] "lavenderblush3"       "lavenderblush4"       "lawngreen"           
[394] "lemonchiffon"         "lemonchiffon1"        "lemonchiffon2"       
[397] "lemonchiffon3"        "lemonchiffon4"        "lightblue"           
[400] "lightblue1"           "lightblue2"           "lightblue3"          
[403] "lightblue4"           "lightcoral"           "lightcyan"           
[406] "lightcyan1"           "lightcyan2"           "lightcyan3"          
[409] "lightcyan4"           "lightgoldenrod"       "lightgoldenrod1"     
[412] "lightgoldenrod2"      "lightgoldenrod3"      "lightgoldenrod4"     
[415] "lightgoldenrodyellow" "lightgray"            "lightgreen"          
[418] "lightgrey"            "lightpink"            "lightpink1"          
[421] "lightpink2"           "lightpink3"           "lightpink4"          
[424] "lightsalmon"          "lightsalmon1"         "lightsalmon2"        
[427] "lightsalmon3"         "lightsalmon4"         "lightseagreen"       
[430] "lightskyblue"         "lightskyblue1"        "lightskyblue2"       
[433] "lightskyblue3"        "lightskyblue4"        "lightslateblue"      
[436] "lightslategray"       "lightslategrey"       "lightsteelblue"      
[439] "lightsteelblue1"      "lightsteelblue2"      "lightsteelblue3"     
[442] "lightsteelblue4"      "lightyellow"          "lightyellow1"        
[445] "lightyellow2"         "lightyellow3"         "lightyellow4"        
[448] "limegreen"            "linen"                "magenta"             
[451] "magenta1"             "magenta2"             "magenta3"            
[454] "magenta4"             "maroon"               "maroon1"             
[457] "maroon2"              "maroon3"              "maroon4"             
[460] "mediumaquamarine"     "mediumblue"           "mediumorchid"        
[463] "mediumorchid1"        "mediumorchid2"        "mediumorchid3"       
[466] "mediumorchid4"        "mediumpurple"         "mediumpurple1"       
[469] "mediumpurple2"        "mediumpurple3"        "mediumpurple4"       
[472] "mediumseagreen"       "mediumslateblue"      "mediumspringgreen"   
[475] "mediumturquoise"      "mediumvioletred"      "midnightblue"        
[478] "mintcream"            "mistyrose"            "mistyrose1"          
[481] "mistyrose2"           "mistyrose3"           "mistyrose4"          
[484] "moccasin"             "navajowhite"          "navajowhite1"        
[487] "navajowhite2"         "navajowhite3"         "navajowhite4"        
[490] "navy"                 "navyblue"             "oldlace"             
[493] "olivedrab"            "olivedrab1"           "olivedrab2"          
[496] "olivedrab3"           "olivedrab4"           "orange"              
[499] "orange1"              "orange2"              "orange3"             
[502] "orange4"              "orangered"            "orangered1"          
[505] "orangered2"           "orangered3"           "orangered4"          
[508] "orchid"               "orchid1"              "orchid2"             
[511] "orchid3"              "orchid4"              "palegoldenrod"       
[514] "palegreen"            "palegreen1"           "palegreen2"          
[517] "palegreen3"           "palegreen4"           "paleturquoise"       
[520] "paleturquoise1"       "paleturquoise2"       "paleturquoise3"      
[523] "paleturquoise4"       "palevioletred"        "palevioletred1"      
[526] "palevioletred2"       "palevioletred3"       "palevioletred4"      
[529] "papayawhip"           "peachpuff"            "peachpuff1"          
[532] "peachpuff2"           "peachpuff3"           "peachpuff4"          
[535] "peru"                 "pink"                 "pink1"               
[538] "pink2"                "pink3"                "pink4"               
[541] "plum"                 "plum1"                "plum2"               
[544] "plum3"                "plum4"                "powderblue"          
[547] "purple"               "purple1"              "purple2"             
[550] "purple3"              "purple4"              "red"                 
[553] "red1"                 "red2"                 "red3"                
[556] "red4"                 "rosybrown"            "rosybrown1"          
[559] "rosybrown2"           "rosybrown3"           "rosybrown4"          
[562] "royalblue"            "royalblue1"           "royalblue2"          
[565] "royalblue3"           "royalblue4"           "saddlebrown"         
[568] "salmon"               "salmon1"              "salmon2"             
[571] "salmon3"              "salmon4"              "sandybrown"          
[574] "seagreen"             "seagreen1"            "seagreen2"           
[577] "seagreen3"            "seagreen4"            "seashell"            
[580] "seashell1"            "seashell2"            "seashell3"           
[583] "seashell4"            "sienna"               "sienna1"             
[586] "sienna2"              "sienna3"              "sienna4"             
[589] "skyblue"              "skyblue1"             "skyblue2"            
[592] "skyblue3"             "skyblue4"             "slateblue"           
[595] "slateblue1"           "slateblue2"           "slateblue3"          
[598] "slateblue4"           "slategray"            "slategray1"          
[601] "slategray2"           "slategray3"           "slategray4"          
[604] "slategrey"            "snow"                 "snow1"               
[607] "snow2"                "snow3"                "snow4"               
[610] "springgreen"          "springgreen1"         "springgreen2"        
[613] "springgreen3"         "springgreen4"         "steelblue"           
[616] "steelblue1"           "steelblue2"           "steelblue3"          
[619] "steelblue4"           "tan"                  "tan1"                
[622] "tan2"                 "tan3"                 "tan4"                
[625] "thistle"              "thistle1"             "thistle2"            
[628] "thistle3"             "thistle4"             "tomato"              
[631] "tomato1"              "tomato2"              "tomato3"             
[634] "tomato4"              "turquoise"            "turquoise1"          
[637] "turquoise2"           "turquoise3"           "turquoise4"          
[640] "violet"               "violetred"            "violetred1"          
[643] "violetred2"           "violetred3"           "violetred4"          
[646] "wheat"                "wheat1"               "wheat2"              
[649] "wheat3"               "wheat4"               "whitesmoke"          
[652] "yellow"               "yellow1"              "yellow2"             
[655] "yellow3"              "yellow4"              "yellowgreen"         
# Set colors by position using color name
g + scale_color_manual(
    values = 
      c("red",  # A
        "gold") # B
  )

# Set colors by name using color name
g + scale_color_manual(
    values = 
      c("A" = "red2",  
        "B" = "gold1") 
  )

We can set the colors values using a HEX code which is a [hexidecimal] number from 0 to 255 for each of the red, green, and blue color channels. These hexidecimal codes were obtained from the ISU Color Brand page.

# Set colors by hex
g + scale_color_manual(
    values = 
      c("A" = "#C8102E", # ISU Cardinal
        "B" = "#F1BE48") # ISU Gold
  )

Set colors using RGB values. RGB values in R are specified as decimal values between 0 and 1 for the red, green, and blue color channels. Hexidecimal colors (as used above) are [hexidecimal] integer values from 0 to 255. So many times, you will see RGB values given as [decimal] integer values from 0 to 255. Below, we use the maxColorValue argument in the rgb() function to allow R to rescale to RGB values to (0,1).

# Set colors by rgb value
g + scale_color_manual(
    values = 
      c("A" = rgb(241, 190, 72, maxColorValue = 255), # ISU Gold
        "B" = rgb(200,  16, 46, maxColorValue = 255)) # ISU Cardinal 
  )

Let’s reset the colors to always use ISU colors (be default).

# Resave plot using ISU colors
g <- g +  scale_color_manual(
    values = 
      c("A" = "#C8102E", # ISU Cardinal
        "B" = "#F1BE48") # ISU Gold
  )

g

15.5.1 Palettes

A number of built in palettes can be used to quickly change color schemes. The ggplot2 package has a number of built in palettes. Here is a color palette that is colorblind friendly.

# Viridis discrete scale
g + scale_color_viridis_d() 
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

For black-and-white printing, we can use a grey color palette.

# Grey scale
g + scale_color_grey() 
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

The RColorBrewer package has a number of pre-built palettes.

# RColorBrewer palettes
library("RColorBrewer") # install.packages("RColorBrewer)
par(mar=c(3,4,2,2))
display.brewer.all()

Set an RColorBrewer palette using the scale_color_brewer() function.

# Set RColorBrewer Accent palette
g + scale_color_brewer(palette = "Accent")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

15.6 Shapes

When plotting points there are a variety of shapes to choose from:

?points
d <- data.frame(p = 0:25) |>
  mutate(
    x = p %%  6, # modulo
    y = p %/% 6, # integer division, i.e. round down
    
    # Fix location for points with both fill and color aesthetics
    x = ifelse(p > 20, (p+3) %%  6, x),
    y = ifelse(p > 20, (p+3) %/% 6, y)
  )

Here are all the shapes available in R. Shapes in the top row have both a fill and color aesthetic while the remaining shapes only have a color aesthetic.

Shapes can be set manually by position or by name.

# Set shape by position (alphabetical ordering)
g + scale_shape_manual(
    values = 
      c(16,  # A
         6)) # B

# Set shapes by name
g + scale_shape_manual(
    values = 
      c("A" = 15,  
        "B" =  5)) 

15.7 Lines

The information for lines is hidden within the help file for par (which is shorthand for graphical [par]ameters). Run the following help command, then scroll halfway through to the lty section.

?par
lt <- c("blank", "solid", "dashed", "dotted", "dotdash", "longdash", "twodash")

Here are all the lines

Since our current plot does not have any lines, let’s add some lines to our plot.

# Calculate mean breaks fo reach tension-wool combination
s <- warpbreaks |>
  group_by(tension, wool) |>
  summarize(
    breaks = mean(breaks), # Use `breaks` name so plot color will be consistent
    .groups = "drop"
  )

# Add lines to plot
g <- g + 
  geom_line(data = s,
            aes(linetype = wool,
                group    = wool))

g

Set lines

g + scale_linetype_manual(
  values = c(
    "A" = "dotted",
    "B" = "dotdash"
  )
)

15.7.1 Straight

A variety of straight lines can also be added to the plot

# Horizontal line
g + geom_hline(yintercept = 22.5, linetype = "longdash")

# Vertical line
# Groups are set at integers starting at 1
g + geom_vline(xintercept =  1.5, linetype = "longdash")

# General line (doesn't make much sense in this plot)
g + geom_abline(intercept = -20, slope = 20, linetype = "longdash")

15.8 Annotate

To add text to the plot, we use the annotate() function with the “text” geom. The x and y coordinates here are exact coordinates rather than the (0,1) relative coordinates that were used for legend placement. Also, the discrete scale is integer-based, starting at 1.

# Add text annotation
g + annotate(
  geom  = "text",
  x     = 1.3,          
  y     = 68,           
  label = "Outliers?"
)

15.9 Summary

This page provides a variety of commonly used customization options for ggplot2 graphics. This is really just the beginning as there are many more things you can do.

If we put together everything from above, code to construct the graphic might look like the following.

# Pretty names for plotting
d <- warpbreaks |>
  rename(
    Wool                = "wool",
    Tension             = "tension",
    `Number of Breaks`  = "breaks"
  ) |> 
  mutate(
    Tension = fct_recode(Tension,
                         Low    = "L",
                         Medium = "M",
                         High   = "H"
    ))

# Calculate mean breaks fo reach tension-wool combination
s <- d |>
  group_by(Tension, Wool) |>
  summarize(
    `Number of Breaks` = mean(`Number of Breaks`), 
    .groups = "drop"
  )

ggplot(d, 
       aes(x     = Tension, 
           y     = `Number of Breaks`,
           color = Wool,
           shape = Wool)) +
  geom_jitter(
    height = 0,
    width  = 0.1,
    size   = 3    # increase size so thumbnail looks good
  ) + 
  
  geom_line(data = s,
            aes(linetype = Wool,
                group    = Wool)) +
  
  scale_color_manual(
    values = 
      c("A" = "#C8102E",    # ISU Cardinal
        "B" = "#F1BE48")) + # ISU Gold
  
  scale_linetype_manual(
    values = c(
      "A" = "dotted",
      "B" = "dashed")) +
  
  scale_y_continuous(
    breaks = c(10, 30, 50),          
    limits = c(0, 70)) +     
  
  geom_hline(yintercept = 45, 
             linetype = "longdash",
             color = "grey") +    
  
  annotate(
    geom  = "text",
    x     = 1.3,          
    y     = 68,           
    label = "Outliers?"
  ) +
  
  labs(
    title    = "Loom efficiency",
    subtitle = "Number of Breaks vs Tension and Wool Type"
  ) +
  
  theme_light()