# Books

## The Grammar of Graphics

• Data: Raw data that we'd like to visualize
• Geometrics: shapes that we use to visualize data
• Aesthetics: Properties of geometries (size, color, etc)
• Scales: Mapping between geometries and aesthetics

### Scatterplot aesthetics

geom_point(). The aesthetics is geom dependent.

• x, y
• shape
• color
• size. It is not always to put 'size' inside aes(). See an example at Legend layout.
• alpha
```library(ggplot2)
library(tidyverse)
set.seed(1)
x1 <- rbinom(100, 1, .5) - .5
x2 <- c(rnorm(50, 3, .8)*.1, rnorm(50, 8, .8)*.1)
x3 <- x1*x2*2
# x=1:100, y=x1, x2, x3
tibble(x=1:length(x1), T=x1, S=x2, I=x3) %>%
tidyr::pivot_longer(-x) %>%
ggplot(aes(x=x, y=value, group=name)) +
geom_point(aes(color=name))

# Cf
matplot(1:length(x1), cbind(x1, x2, x3), pch=16,
col=c('cornflowerblue', 'springgreen3', 'salmon'))
```

## Help

```> library(ggplot2)
Need help? Try Stackoverflow: https://stackoverflow.com/tags/ggplot2
```

# Some examples

## Examples from 'R for Data Science' book - Aesthetic mappings

```ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
# the 'mapping' is the 1st argument for all geom_* functions, so we can safely skip it.
# template
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

# add another variable through color, size, alpha or shape
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy, color = class))

ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy, size = class))

ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy, alpha = class))

ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy, shape = class))

ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy), color = "blue")

# add another variable through facets
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy)) +
facet_wrap(~ class, nrow = 2)

# add another 2 variables through facets
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl)
```

## Examples from 'R for Data Science' book - Geometric objects, lines and smoothers

```# Points
ggplot(data = mpg) +
geom_point(aes(x = displ, y = hwy)) # we can add color to aes()

# Line plot
ggplot() +
geom_line(aes(x, y))  # we can add color to aes()

# Smoothed
# 'size' controls the line width
ggplot(data = mpg) +
geom_smooth(aes(x = displ, y = hwy), size=1)

# Points + smoother, add transparency to points, remove se
# We add transparency if we need to make smoothed line stands out
#                    and points less significant
# We move aes to the '''mapping''' option in ggplot()
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(alpha=1/10) +
geom_smooth(se=FALSE)

# Colored points + smoother
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class)) +
geom_smooth()
```

## Examples from 'R for Data Science' book - Transformation, bar plot

```# y axis = counts
# bar plot
ggplot(data = diamonds) +
geom_bar(aes(x = cut))
# Or
ggplot(data = diamonds) +
stat_count(aes(x = cut))

# y axis = proportion
ggplot(data = diamonds) +
geom_bar(aes(x = cut, y = ..prop.., group = 1))

# bar plot with 2 variables
ggplot(data = diamonds) +
geom_bar(aes(x = cut, fill = clarity))
```

# Color palette

## colorspace package

colorspace: A Toolbox for Manipulating and Assessing Colors and Palettes

scale_fill_discrete_qualitative(palette) and an example. The palette selections are different from scale_fill_XXX(). Note that the number of classes can be arbitrary in scale_fill_discrete_qualitative().

## Colour related aesthetics: colour, fill and alpha

### Scatterplot with large number of points: alpha

```ggplot(aes(x, y)) +
geom_point(alpha=.1)
```

## Combine colors and shapes in legend

• https://ggplot2-book.org/scales.html#scale-details In order for legends to be merged, they must have the same name.
```df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "c"))
ggplot(df, aes(x, y)) + geom_point(aes(shape = z, colour = z), size=4)
```
• How to Work with Scales in a ggplot2 in R. This solution is better since it allows to change the legend title. Just make sure the title name we put in both scale_* functions are the same.
```ggplot(mtcars, aes(x=hp, y=mpg)) +
geom_point(aes(shape=factor(cyl), colour=factor(cyl))) +
scale_shape_discrete("Cylinders") +
scale_colour_discrete("Cylinders")
```

## ggplot2::scale functions and scales packages

• Scales control the mapping from data to aesthetics. They take your data and turn it into something that you can see, like size, colour, position or shape.
• Scales also provide the tools that let you read the plot: the axes and legends.

### ggplot2::scale - axes/axis, legend

Naming convention: scale_AestheticName_NameDataType where

• AestheticName can be x, y, color, fill, size, shape, ...
• NameDataType can be continuous, discrete, manual or gradient.

Examples:

• See Figure 12.1: Axis and legend components on the book ggplot2: Elegant Graphics for Data Analysis
```# Set x-axis label
scale_x_discrete("Car type")   # or a shortcut xlab() or labs()
scale_x_continuous("Displacement")

# Set legend title
scale_colour_discrete("Drive\ntrain")    # or a shortcut labs()

# Change the default color
scale_color_brewer()

# Change the axis scale
scale_x_sqrt()

# Change breaks and their labels
scale_x_continuous(breaks = c(2000, 4000), labels = c("2k", "4k"))

# Relabel the breaks in a categorical scale
scale_y_discrete(labels = c(a = "apple", b = "banana", c = "carrot"))
```
• How to change the color in geom_point or lines in ggplot
```ggplot() +
geom_point(data = data, aes(x = time, y = y, color = sample),size=4) +
scale_color_manual(values = c("A" = "black", "B" = "red"))

ggplot(data = data, aes(x = time, y = y, color = sample)) +
geom_point(size=4) +
geom_line(aes(group = sample)) +
scale_color_manual(values = c("A" = "black", "B" = "red"))
```

### ylim and xlim in ggplot2 in axes

Use one of the following

• + scale_x_continuous(limits = c(-5000, 5000))
• + coord_cartesian(xlim = c(-5000, 5000))
• + xlim(-5000, 5000)

### Emulate ggplot2 default color palette

It is just equally spaced hues around the color wheel. Emulate ggplot2 default color palette

```gg_color_hue <- function(n) {
hues = seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}

n = 4
cols = gg_color_hue(n)

dev.new(width = 4, height = 4)
plot(1:n, pch = 16, cex = 2, col = cols)
```

Answer 2 (better, it shows the color values in HEX). It should be read from left to right and then top to down.

scales package

```library(scales)
show_col(hue_pal()(4)) # ("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")
# (Salmon, Christi, Iris Blue, Heliotrope)
show_col(hue_pal()(2)) # ("#F8767D", "#00BFC4") = (salmon, iris blue)
# see https://www.htmlcsscolor.com/ for color names
```

See also the last example in ggsurv() where the KM plots have 4 strata. The colors can be obtained by scales::hue_pal()(4) with hue_pal()'s default arguments.

R has a function called colorName() to convert a hex code to color name; see roloc package.

## Class variables

"Set1" is a good choice. See RColorBrewer::display.brewer.all()

## Heatmap for single channel

```# White <----> Blue
RColorBrewer::display.brewer.pal(n = 8, name = "Blues")
```

## Heatmap for dual channels

```library(RcolorBrewer)
# Red <----> Blue
display.brewer.pal(n = 8, name = 'RdBu')
brewer.pal(n = 8, name = "RdBu")

plot(1:8, col=brewer_pal(palette = "RdBu")(8), pch=20, cex=4)

# Blue <----> Red
plot(1:8, col=rev(brewer_pal(palette = "RdBu")(8)), pch=20, cex=4)
```

# Themes and background for ggplot2

## Background

• Export plot in .png with transparent background in base R plot.
```x = c(1, 2, 3)
op <- par(bg=NA)
plot (x)

dev.copy(png,'myplot.png')
dev.off()
par(op)
```
• Transparent background with ggplot2
```library(ggplot2)
data("airquality")

p <- ggplot(airquality, aes(Solar.R, Temp)) +
geom_point() +
geom_smooth() +
# set transparency
theme(
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "transparent",colour = NA),
plot.background = element_rect(fill = "transparent",colour = NA)
)
p
ggsave("airquality.png", p, bg = "transparent")
```
• ggplot2 theme background color and grids
```ggplot() + geom_bar(aes(x=, fill=y)) +
theme(panel.background=element_rect(fill='purple')) +
theme(plot.background=element_blank())

ggplot() + geom_bar(aes(x=, fill=y)) +
theme(panel.background=element_blank()) +
theme(plot.background=element_blank()) # minimal background like base R
# the grid lines are not gone; they are white so it is the same as the background

ggplot() + geom_bar(aes(x=, fill=y)) +
theme(panel.background=element_blank()) +
theme(plot.background=element_blank()) +
theme(panel.grid.major.y = element_line(color="grey"))
# draw grid line on y-axis only

ggplot() + geom_bar() +
theme_bw()

ggplot() + geom_bar() +
theme_minimal()

ggplot() + geom_bar() +
theme_void()

ggplot() + geom_bar() +
theme_dark()
```

ggthmr package

## Rotate x-axis labels

```theme(axis.text.x = element_text(angle = 90)
```

## Add axis on top or right hand side

• Specify a secondary axis, sec_axis(). This new function was added in ggplot2 2.2.0; see here.
• Create secondary x-axis in ggplot2. dup_axis(name, breaks, labels). Note that ggplot2 uses breaks while base R plot uses at. See R → Include labels on the top axis/margin: axis().
```# Bottom x-axis is the quantiles and the top x-axis is the original values

Fn <- ecdf(mtcars\$mpg)
mtcars %>% dplyr::mutate(quantile = Fn(mpg)) %>%
ggplot(aes(x= quantile, y= disp)) +
geom_point() +
scale_x_continuous(name = "quantile of mpg",
breaks=c(.25, .5, .75, 1.0),
labels = c("0.25", "0.50", "0.75", "1.00"),
sec.axis = dup_axis(name = "mpg",
breaks = c(.25, .5, .75, 1.0),
labels = quantile(mtcars\$mpg, c(.25, .5, .75, 1.0))))
```
• How to add line at top panel border of ggplot2
```mtcars %>%
ggplot(aes(x= mpg, y= disp)) +
geom_point() +
annotate(geom = 'segment', y = Inf, yend = Inf, color = 'green',
x = -Inf, xend = Inf, size = 4)
```
• ggplot2: Secondary Y axis
• Dual Y axis with R and ggplot2

## ggthemes package

```ggplot() + geom_bar() +
theme_solarized()   # sun color in the background

theme_excel()
theme_wsj()
theme_economist()
theme_fivethirtyeight()
```

# Common plots

## Histogram

Histograms is a special case of bar plots. Instead of drawing each unique individual values as a bar, a histogram groups close data points into bins.

```ggplot(data = txhousing, aes(x = median)) +
geom_histogram()  # adding 'origin =0' if we don't expect negative values.
```

Histogram vs barplot from deeply trivial.

## Boxplot

Be careful that if we added scale_y_continuous(expand = c(0,0), limits = c(0,1)) to the code, it will change the boxplot if some data is outside the range of (0, 1). The console gives a warning message in this case.

### Base R method

```dim(df) # 112436 x 2
mycol <- c("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")
# mycol defines colors of 4 levels in df\$Method (a factor)
boxplot(df\$value ~ df\$Method, col = mycol, xlab="Method")
```

### Color fill/scale_fill_XXX

```n <- 100
k <- 12
set.seed(1234)
cond <- factor(rep(LETTERS[1:k], each=n))
rating <- rnorm(n*k)
dat <- data.frame(cond = cond, rating = rating)

p <- ggplot(dat, aes(x=cond, y=rating, fill=cond)) +
geom_boxplot()

p + scale_fill_hue() + labs(title="hue default") # Same as only p
p + scale_fill_hue(l=40, c=35) + labs(title="hue options")
p + scale_fill_brewer(palette="Dark2") + labs(title="Dark2")
p + colorspace::scale_fill_discrete_qualitative(palette = "Dark 3") + labs(title="Dark 3")
p + scale_fill_brewer(palette="Accent") + labs(title="Accent")
p + scale_fill_brewer(palette="Pastel1") + labs(title="Pastel1")
p + scale_fill_brewer(palette="Set1") + labs(title="Set1")
p + scale_fill_brewer(palette="Paired") + labs(title="Paired")
# cbbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
# p + scale_fill_manual(values=cbbPalette)
```

ColorBrewer palettes RColorBrewer::display.brewer.all() to display all brewer palettes.

Reference from ggplot2. scale_fill_binned, scale_fill_brewer, scale_fill_continuous, scale_fill_date, scale_fill_datetime, scale_fill_discrete, scale_fill_distiller, scale_fill_gradient, scale_fill_gradientc, scale_fill_gradientn, scale_fill_grey, scale_fill_hue, scale_fill_identity, scale_fill_manual, scale_fill_ordinal, scale_fill_steps, scale_fill_steps2, scale_fill_stepsn, scale_fill_viridis_b, scale_fill_viridis_c, scale_fill_viridis_d

### Jittering

```# Only 1 variable
ggplot(data.frame(Wi), aes(y = Wi)) +
geom_boxplot()

# Two variable, one of them is a factor
ggplot() + geom_jitter(mapping = aes(x, y))

# Box plot
ggplot() + geom_boxplot(mapping = aes(x, y))
```
```# df2 is n x 2
ggplot(df2, aes(x=nboot, y=boot)) +
geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
geom_jitter(aes(color=nboot), position=position_jitter(width=.2, height=0, seed=1)) +
labs(title="", y = "", x = "nboot")
```

If we omit the outlier.shape=NA option in geom_boxplot(), we will get the following plot.

### Groups of boxplots

How To Make Grouped Boxplots with ggplot2?. Use the fill parameter such as

```mydata %>%
ggplot(aes(x=Factor1, y=Response, fill=factor(Factor2))) +
geom_boxplot()
```

## Violin plot

```library(ggplot2)
ggplot(midwest, aes(state, area)) + geom_violin() + ggforce::geom_sina()
```

## Kernel density plot

• Overlay histograms with density plots
```library(ggplot2); library(tidyr)
x <- data.frame(v1=rnorm(100), v2=rnorm(100,1,1),
v3=rnorm(100, 0,2))
data <- pivot_longer(x, cols=1:3)
ggplot(data, aes(x=value, fill=name)) +
geom_histogram(aes(y=..density..), alpha=.25) +
stat_density(geom="line", aes(color=name, linetype=name))
ggplot(data, aes(x=value, fill=name, col =name)) +
geom_density(alpha = .4)
```

## barplot

### Ordered barplot and facet

```ggplot(df, aes(x=reorder(x, -y), y=y)) + geom_bar(stat = 'identity')

ggplot(df, aes(x=reorder(x, desc(y)), y=y)), geom_col()
```

coord_flip()

### Rotate x-axis labels

```ggplot(mydf) + geom_col(aes(x = model, y=value, fill = method), position="dodge")+
theme(axis.text.x = element_text(angle = 45, hjust=1))
```

### Starts at zero

```scale_y_continuous(expand = c(0,0), limits = c(0, YourLimit))
```

## Step function

Connect observations: geom_path(), geom_step()

Example: KM curves (without legend)

```library(survival)
sf <- survfit(Surv(time, status) ~ x, data = aml)
sf
str(sf) # the first 10 forms one strata and the rest 10 forms the other
ggplot() +
geom_step(aes(x=c(0, sf\$time[1:10]), y=c(1, sf\$surv[1:10])),
col='red') +
scale_x_continuous('Time', limits = c(0, 161)) +
scale_y_continuous('Survival probability', limits = c(0, 1)) +
geom_step(aes(x=c(0, sf\$time[11:20]), y=c(1, sf\$surv[11:20])),
col='black')
# cf:  plot(sf, col = c('red', 'black'), mark.time=FALSE)
```

Same example but with legend (see Construct a manual legend for a complicated plot)

```cols <- c("NEW"="#f04546","STD"="#3591d1")
ggplot() +
geom_step(aes(x=c(0, sf\$time[1:10]), y=c(1, sf\$surv[1:10]), col='NEW')) +
scale_x_continuous('Time', limits = c(0, 161)) +
scale_y_continuous('Survival probability', limits = c(0, 1)) +
geom_step(aes(x=c(0, sf\$time[11:20]), y=c(1, sf\$surv[11:20]), col='STD')) +
scale_colour_manual(name="Treatment", values = cols)
```

# Aesthetics

• We can create a new aesthetic name in aes(aesthetic = variable) function; for example, the "text2" below. In this case "text2" name will not be shown; only the original variable will be used.
```library(plotly)
g <- ggplot(tail(iris), aes(Petal.Length, Sepal.Length, text2=Species)) + geom_point()
ggplotly(g, tooltip = c("Petal.Length", "text2"))
```

# GUI/Helper packages

## esquisse (French, means 'sketch'): creating ggplot2 interactively

A 'shiny' gadget to create 'ggplot2' charts interactively with drag-and-drop to map your variables. You can quickly visualize your data accordingly to their type, export to 'PNG' or 'PowerPoint', and retrieve the code to reproduce the chart.

The interface introduces basic terms used in ggplot2:

• x, y,
• fill (useful for geom_bar, geom_rect, geom_boxplot, & geom_raster, not useful for scatterplot),
• color (edges for geom_bar, geom_line, geom_point),
• size,
• facet, split up your data by one or more variables and plot the subsets of data together.

It does not include all features in ggplot2. At the bottom of the interface,

• Labels & title & caption.
• Plot options. Palette, theme, legend position.
• Data. Remove subset of data.
• Export & code. Copy/save the R code. Export file as PNG or PowerPoint.

## ggx

https://github.com/brandmaier/ggx Create ggplot in natural language

# subplot

## Adding/Inserting an image to ggplot2

See also ggbernie which uses a different way ggplot2::layer() and a self-defined geom (geometric object).

# Easy way to mix multiple graphs on the same page

## gridExtra

### Force a regular plot object into a Grob for use in grid.arrange

gridGraphics package

# labs for x and y axes

## x and y labels

https://stackoverflow.com/questions/10438752/adding-x-and-y-axis-labels-in-ggplot2 or the Labels part of the cheatsheet

You can set the labels with xlab() and ylab(), or make it part of the scale_*.* call.

```labs(x = "sample size", y = "ngenes (glmnet)")

scale_x_discrete(name="sample size")
scale_y_continuous(name="ngenes (glmnet)", limits=c(100, 500))
```

## name-value pairs

See several examples (color, fill, size, ...) from opioid prescribing habits in texas.

# Prevent sorting of x labels

The idea is to set the levels of x variable.

```junk   # n x 2 table
colnames(junk) <- c("gset", "boot")
junk\$gset <- factor(junk\$gset, levels = as.character(junk\$gset))
ggplot(data = junk, aes(x = gset, y = boot, group = 1)) +
geom_line() +
theme(axis.text.x=element_text(color = "black", angle=30, vjust=.8, hjust=0.8))
```

# Legends

## Legend title

• labs() function
```p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z))
p + labs(x = "X axis", y = "Y axis", colour = "Colour\nlegend")
```
• scale_colour_manual()
```scale_colour_manual("Treatment", values = c("black", "red"))
```
• scale_color_discrete() and scale_shape_discrete(). See Combine colors and shapes in legend.
```df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "c"))
ggplot(df, aes(x, y)) + geom_point(aes(shape = z, colour = z), size=5) +
scale_color_discrete('new title') + scale_shape_discrete('new title')
```

## Layout: move the legend from right to top/bottom of the plot or hide it

```gg + theme(legend.position = "top")

gg + theme(legend.position="none")
```

## Guide functions for finer control

https://ggplot2-book.org/scales.html#guide-functions The guide functions, guide_colourbar() and guide_legend(), offer additional control over the fine details of the legend.

guide_legend() allows the modification of legends for scales, including fill, color, and shape.

This function can be used in scale_fill_manual(), scale_fill_continuous(), ... functions.

```scale_fill_manual(values=c("orange", "blue"),
guide=guide_legend(title = "My Legend Title",
nrow=1,  # multiple items in one row
label.position = "top", # move the texts on top of the color key
keywidth=2.5)) # increase the color key width
```

The problem with the default setting is it leaves a lot of white space above and below the legend. To change the position of the entire legend to the bottom of the plot, we use theme().

```theme(legend.position = 'bottom')
```

## Legend symbol background

```ggplot() + geom_point(aes(x, y, color, size)) +
theme(legend.key = element_blank())
# remove the symbol background in legend
```

# ggtitle()

## Centered title

See the Legends part of the cheatsheet.

```ggtitle("MY TITLE") +
theme(plot.title = element_text(hjust = 0.5))
```

### Subtitle

```ggtitle("My title",
subtitle = "My subtitle")
```

# Aspect ratio

?coord_fixed

```p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + coord_fixed() # plot is compressed horizontally
p  # fill up plot region
```

# Time series plot

```set.seed(45)
nc <- 9
df <- data.frame(x=rep(1:5, nc), val=sample(1:100, 5*nc),
variable=rep(paste0("category", 1:nc), each=5))
# plot
# http://colorbrewer2.org/#type=qualitative&scheme=Paired&n=9
ggplot(data = df, aes(x=x, y=val)) +
geom_line(aes(colour=variable)) +
scale_colour_manual(values=c("#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00", "#cab2d6"))
```

Versus old fashion

```dat <- matrix(runif(40,1,20),ncol=4) # make data
matplot(dat, type = c("b"),pch=1,col = 1:4) #plot
legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend
```

# geom_bar(), geom_col(), stat_count()

```geom_col(position = 'dodge')  # same as
geom_bar(stat = 'identity', position = 'dodge')
```

geom_bar() can not specify the y-axis. To specify y-axis, use geom_col().

```ggplot() + geom_col(mapping = aes(x, y))
```

# geom_segment()

Cf annotate("segment", ...)

# Square shaped plot

```ggplot() + theme(aspect.ratio=1) # do not adjust xlim, ylim

xylim <- range(c(x, y))
ggplot() + coord_fixed(xlim=xylim, ylim=xylim)
```

# geom_errorbar(): error bars

```set.seed(301)
x <- rnorm(10)
SE <- rnorm(10)
y <- 1:10

par(mfrow=c(2,1))
par(mar=c(0,4,4,4))
xlim <- c(-4, 4)
plot(x[1:5], 1:5, xlim=xlim, ylim=c(0+.1,6-.1), yaxs="i", xaxt = "n", ylab = "", pch = 16, las=1)
mtext("group 1", 4, las = 1, adj = 0, line = 1) # las=text rotation, adj=alignment, line=spacing
par(mar=c(5,4,0,4))
plot(x[6:10], 6:10, xlim=xlim, ylim=c(5+.1,11-.1), yaxs="i", ylab ="", pch = 16, las=1, xlab="")
arrows(x[6:10]-SE[6:10], 6:10, x[6:10]+SE[6:10], 6:10, code=3, angle=90, length=0)
mtext("group 2", 4, las = 1, adj = 0, line = 1)
```

# geom_rect(), geom_bar()

Note that we can use scale_fill_manual() to change the 'fill' colors (scheme/palette). The 'fill' parameter in geom_rect() is only used to define the discrete variable.

```ggplot(data=) +
geom_bar(aes(x=, fill=)) +
scale_fill_manual(values = c("orange", "blue"))
```

# Circle

Circle in ggplot2 ggplot(data.frame(x = 0, y = 0), aes(x, y)) + geom_point(size = 25, pch = 1)

## Ellipse

How can a data ellipse be superimposed on a ggplot2 scatterplot?. Hint: use the ellipse package.

# Annotation

## geom_hline(), geom_vline()

```geom_hline(yintercept=1000)
geom_vline(xintercept=99)
```

## text annotations, annotate() and geom_text(): ggrepel package

• https://ggplot2-book.org/annotations.html
```annotate("text", label="Toyota", x=3, y=100)
annotate("segment", x = 2.5, xend = 4, y = 15, yend = 25, colour = "blue", size = 2)

geom_text(aes(x, y, label), data, size, vjust, hjust, nudge_x)
```
• Use the nudge_y parameter to avoid the overlap of the point and the text such as
```ggplot() + geom_point() +
geom_text(aes(x, y, label), color='red', data, nudge_y=1)
```
• What do hjust and vjust do when making a plot using ggplot? 0 means left-justified 1 means right-justified.

## Text wrap

```p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()

# Solution 1: Not work with Chinese characters
wrapper <- function(x, ...) paste(strwrap(x, ...), collapse = "\n")
# The a label
my_label <- "Some arbitrarily larger text"
# and finally your plot with the label
p + annotate("text", x = 4, y = 25, label = wrapper(my_label, width = 5))

# Solution 2: Not work with Chinese characters
library(RGraphics)
library(ggplot2)
p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
grob1 <-  splitTextGrob("Some arbitrarily larger text")
p + annotation_custom(grob = grob1,  xmin = 3, xmax = 4, ymin = 25, ymax = 25)

# Solution 3: stringr::str_wrap()
my_label <- "太極者無極而生。陰陽之母也。動之則分。靜之則合。無過不及。隨曲就伸。人剛我柔謂之走。我順人背謂之黏。"
p <- ggplot() + geom_point() + xlim(0, 400) + ylim(0, 300) # 400x300 e-paper
p + annotate("text", x = 0, y = 200, hjust=0, size=5,
label = stringr::str_wrap(my_label, width =30)) +
theme_bw () +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank())
```

# Save the plots

ggsave() We can specify dpi to increase the resolution. For example,

```g1 <- ggplot(data = mydf)
g1
ggsave("myfile.png", g1, height = 7, width = 8, units = "in", dpi = 500)
```

I got an error - Error in loadNamespace(name) : there is no package called ‘svglite’. After I install the package, everything works fine.

```ggsave("raw-output.bmp", p, width=4, height=3, dpi = 100)
# Will generate 4*100 x 3*100 pixel plot
```

## Multiple pages in pdf

https://stackoverflow.com/a/53698682. The key is to save the plot in an object and use the print() function.

```pdf("FileName", onefile = TRUE)
for(i in 1:I) {
p <- ggplot()
print(p)
}
dev.off()
```

# ggstatsplot

ggstatsplot: ggplot2 Based Plots with Statistical Details

# Some packages depend on ggplot2

dittoSeq from Bicoonductor

# Python

plotnine: A Grammar of Graphics for Python.

plotnine is an implementation of a grammar of graphics in Python, it is based on ggplot2. The grammar allows users to compose plots by explicitly mapping data to the visual objects that make up the plot.