Load the mtcars
data
data(mtcars, package="datasets")
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
Plot with base graphics
This doesn’t quite come out right because it is hard to coordinate
the choices for point symbols and colors in the plot with those in the
legend
mtcars$cyl <- as.factor(mtcars$cyl)
plot(mpg ~ hp , data=mtcars,
col=cyl, pch=c(4,6,8)[mtcars$cyl], cex=1.2)
legend("topright", legend=levels(mtcars$cyl),
pch = c(4,6,8),
col=levels(mtcars$cyl))
Plots with ggplot2
Basic plot: mpg
vs. hp
Specify aesthetic mappings for x=hp
and
y=mpg
to setup the coordinates, then add points with
geom_point()
library(ggplot2)
ggplot(mtcars, aes(x=hp, y=mpg)) +
geom_point(size=3)
Distinguish cars by number of cylinders
Use color and shape as additional aesthetics. To do this, make
cyl
a factor
library(dplyr)
mtcars <- mtcars |>
mutate(cyl = as.factor(cyl))
ggplot(mtcars, aes(x=hp, y=mpg,
color=cyl,
shape=cyl)) +
geom_point(size=3)
Add separate regression lines
ggplot(mtcars, aes(x=hp, y=mpg, color=cyl, shape=cyl)) +
geom_point(size=3) +
geom_smooth(method="lm", aes(fill=cyl))
Add overall smooth
ggplot(mtcars, aes(x=hp, y=mpg)) +
geom_point(size=3, aes(color=cyl, shape=cyl)) +
geom_smooth(method="loess", color="black", se=FALSE, lwd = 2) +
geom_smooth(method="lm", aes(color=cyl, fill=cyl))
Change the theme
last_plot() + theme_bw()
Faceting
plt <-
ggplot(mtcars, aes(x=hp, y=mpg, color=cyl, shape=cyl)) +
geom_point(size=3) +
geom_smooth(method="lm", aes(fill=cyl))
plt + facet_wrap(~cyl)
Labeling points, change theme,
plt2 <- ggplot(mtcars, aes(x=wt, y=mpg)) +
geom_point(color = 'red', size=2) +
geom_smooth(method="loess") +
labs(y="Miles per gallon", x="Weight (1000 lbs.)") +
theme_classic(base_size = 16)
plt2 + geom_text(aes(label = rownames(mtcars)))
library(ggrepel)
plt2 + geom_text_repel(aes(label = rownames(mtcars)))
Only label points with large residuals
mod <- loess( mpg ~ wt, data=mtcars)
resids <- residuals(mod)
mtcars$label <- ifelse(abs(resids) > 2.5, rownames(mtcars), "")
plt2 +
geom_text_repel(aes(label = mtcars$label))
IycgLS0tDQojJyB0aXRsZTogIlBsb3RzIG9mIG10Y2FycyBkYXRhIHdpdGggZ2dwbG90MiINCiMnIGF1dGhvcjogIk1pY2hhZWwgRnJpZW5kbHkiDQojJyBjYXRlZ29yeTogImdncGxvdDIiDQojJyBkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCINCiMnIG91dHB1dDoNCiMnICAgaHRtbF9kb2N1bWVudDoNCiMnICAgICB0aGVtZTogcmVhZGFibGUNCiMnICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQojJyAgIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQgICAgDQojJyAtLS0NCg0KIysgZWNobz1GQUxTRQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmc9RkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgIFIub3B0aW9ucz1saXN0KGRpZ2l0cz00KSkNCg0KIycgIyMgTG9hZCB0aGUgYG10Y2Fyc2AgZGF0YQ0KZGF0YShtdGNhcnMsIHBhY2thZ2U9ImRhdGFzZXRzIikNCnN0cihtdGNhcnMpDQoNCiMnICMjIFBsb3Qgd2l0aCBiYXNlIGdyYXBoaWNzDQojJyBUaGlzIGRvZXNuJ3QgcXVpdGUgY29tZSBvdXQgcmlnaHQgYmVjYXVzZSBpdCBpcyBoYXJkIHRvIGNvb3JkaW5hdGUgdGhlIA0KIycgY2hvaWNlcyBmb3IgcG9pbnQgc3ltYm9scyBhbmQgY29sb3JzIGluIHRoZSBwbG90IHdpdGggdGhvc2UgaW4gdGhlIGxlZ2VuZA0KDQptdGNhcnMkY3lsIDwtIGFzLmZhY3RvcihtdGNhcnMkY3lsKQ0KcGxvdChtcGcgfiBocCAsIGRhdGE9bXRjYXJzLCANCgljb2w9Y3lsLCBwY2g9Yyg0LDYsOClbbXRjYXJzJGN5bF0sIGNleD0xLjIpDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kPWxldmVscyhtdGNhcnMkY3lsKSwNCiAgICAgICAgICAgICAgICAgICBwY2ggPSBjKDQsNiw4KSwNCiAgICAgICAgICAgICAgICAgICBjb2w9bGV2ZWxzKG10Y2FycyRjeWwpKQ0KDQojJyAjIyBQbG90cyB3aXRoIGdncGxvdDINCg0KIycgIyMjIEJhc2ljIHBsb3Q6IGBtcGdgIHZzLiBgaHBgDQojJyBTcGVjaWZ5IGFlc3RoZXRpYyBtYXBwaW5ncyBmb3IgYHg9aHBgIGFuZCBgeT1tcGdgIHRvIHNldHVwIHRoZSBjb29yZGluYXRlcywgdGhlbg0KIycgYWRkIHBvaW50cyB3aXRoIGBnZW9tX3BvaW50KClgDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QobXRjYXJzLCBhZXMoeD1ocCwgeT1tcGcpKSArDQogIGdlb21fcG9pbnQoc2l6ZT0zKQ0KDQoNCiMnICMjIyBEaXN0aW5ndWlzaCBjYXJzIGJ5IG51bWJlciBvZiBjeWxpbmRlcnMNCiMnIFVzZSBjb2xvciBhbmQgc2hhcGUgYXMgYWRkaXRpb25hbCBhZXN0aGV0aWNzLiANCiMnIFRvIGRvIHRoaXMsICBtYWtlIGBjeWxgIGEgZmFjdG9yDQpsaWJyYXJ5KGRwbHlyKQ0KbXRjYXJzIDwtIG10Y2FycyB8Pg0KICBtdXRhdGUoY3lsID0gYXMuZmFjdG9yKGN5bCkpDQoNCmdncGxvdChtdGNhcnMsIGFlcyh4PWhwLCB5PW1wZywgDQogICAgICAgICAgICAgICAgICAgY29sb3I9Y3lsLCANCiAgICAgICAgICAgICAgICAgICBzaGFwZT1jeWwpKSArDQoJZ2VvbV9wb2ludChzaXplPTMpDQoNCiMnICMjIyBBZGQgc2VwYXJhdGUgcmVncmVzc2lvbiBsaW5lcw0KZ2dwbG90KG10Y2FycywgYWVzKHg9aHAsIHk9bXBnLCBjb2xvcj1jeWwsIHNoYXBlPWN5bCkpICsNCglnZW9tX3BvaW50KHNpemU9MykgKw0KCWdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBhZXMoZmlsbD1jeWwpKSANCg0KIycgIyMjIEFkZCBvdmVyYWxsIHNtb290aA0KZ2dwbG90KG10Y2FycywgYWVzKHg9aHAsIHk9bXBnKSkgKw0KCWdlb21fcG9pbnQoc2l6ZT0zLCBhZXMoY29sb3I9Y3lsLCBzaGFwZT1jeWwpKSArDQoJZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIGNvbG9yPSJibGFjayIsIHNlPUZBTFNFLCBsd2QgPSAyKSArDQoJZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGFlcyhjb2xvcj1jeWwsIGZpbGw9Y3lsKSkgDQoNCiMnICMjIyBDaGFuZ2UgdGhlIHRoZW1lDQpsYXN0X3Bsb3QoKSArIHRoZW1lX2J3KCkNCg0KDQojJyAjIyBGYWNldGluZw0KcGx0IDwtDQpnZ3Bsb3QobXRjYXJzLCBhZXMoeD1ocCwgeT1tcGcsIGNvbG9yPWN5bCwgc2hhcGU9Y3lsKSkgKw0KCWdlb21fcG9pbnQoc2l6ZT0zKSArDQoJZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGFlcyhmaWxsPWN5bCkpIA0KDQpwbHQgKyBmYWNldF93cmFwKH5jeWwpDQoNCiMnICMjIExhYmVsaW5nIHBvaW50cywgY2hhbmdlIHRoZW1lLCANCnBsdDIgPC0gZ2dwbG90KG10Y2FycywgYWVzKHg9d3QsIHk9bXBnKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gJ3JlZCcsIHNpemU9MikgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIikgKw0KICBsYWJzKHk9Ik1pbGVzIHBlciBnYWxsb24iLCB4PSJXZWlnaHQgKDEwMDAgbGJzLikiKSArDQogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTYpDQpwbHQyICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvd25hbWVzKG10Y2FycykpKQ0KDQpsaWJyYXJ5KGdncmVwZWwpDQpwbHQyICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IHJvd25hbWVzKG10Y2FycykpKQ0KDQojJyAjIyMgT25seSBsYWJlbCBwb2ludHMgd2l0aCBsYXJnZSByZXNpZHVhbHMNCg0KbW9kIDwtIGxvZXNzKCBtcGcgfiB3dCwgZGF0YT1tdGNhcnMpDQpyZXNpZHMgPC0gcmVzaWR1YWxzKG1vZCkNCm10Y2FycyRsYWJlbCA8LSBpZmVsc2UoYWJzKHJlc2lkcykgPiAyLjUsIHJvd25hbWVzKG10Y2FycyksICIiKQ0KDQpwbHQyICsgDQoJZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IG10Y2FycyRsYWJlbCkpIA0KDQo=