2 Lines
It’s a busy week, so I’m going to stick with the map of Scotland. Let’s plot a straight line between every place I’ve lived in Scotland.
2.1 Map
First, a simple map of Scotland.
2.2 Restrict coordinates
I’m not entirely sure what’s going on with that little island around 14W/57.5N, but let’s chop it out of the plot using coord_sf()
.
2.3 Colours and theme
Use theme_map()
from ggthemes
to get rid of the latitude and longitude lines. Set the map colour and fill to “darkseagreen4” to get rid of the county lines.
Add a background colour to the plot. You can customise pretty much any part of a plot with the theme()
function. The plot background is a rectangle, so you customise it using the element_rect()
function, which will let you set the fill, colour, size, and linetype of the element.
Code
# set theme for all subsequent plots
theme_set(theme_map(base_size = 20))
ggplot() +
geom_sf(data = scotland_sf,
color = "darkseagreen4",
fill = "darkseagreen4") +
coord_sf(xlim = c(-8, 0), ylim = c(54.7, 61)) +
theme(plot.background = element_rect(fill = "lightsteelblue1",
color = "steelblue",
size = 4))
2.4 Plot where I’ve lived
I’ll make a table of the latitudes and longitudes of places I’ve lived in Scotland (just looked up on Google maps).
name | years | lat | lon |
---|---|---|---|
St Andrews | 2003-2004 | 56.3398 | -2.7967 |
Aberdeen | 2004-2009 | 57.1462 | -2.1071 |
Oldmeldrum | 2009-2012 | 57.3167 | -2.3167 |
Glasgow | 2012-2022 | 55.8642 | -4.2518 |
And then add it to the map with geom_point()
.
2.5 Add Labels
Now add labels for each location with geom_label()
.
Code
ggplot() +
geom_sf(data = scotland_sf,
color = "darkseagreen4",
fill = "darkseagreen4") +
coord_sf(xlim = c(-8, 0), ylim = c(54.7, 61)) +
geom_point(aes(x = lon, y = lat), lived) +
geom_label(aes(x = lon, y = lat, label = name, fill = years), lived) +
theme(plot.background = element_rect(fill = "lightsteelblue1",
color = "steelblue",
size = 4))
2.6 Customise legend
The legend needs a little customising, which we can do in the theme()
function. If you want to get rid of an element entirely, like the legend background, use element_blank()
. Setting the position to c(0, 1)
puts the anchor point of the legend in the top left corner; setting the justification to c(0, 1)
moved this anchor from the centre of the legend to its top left corner.
I also used scale_fill_brewer()
to change to an orange palette and guides()
to remove the letter a
from the legend.
Code
ggplot() +
geom_sf(data = scotland_sf,
color = "darkseagreen4",
fill = "darkseagreen4") +
coord_sf(xlim = c(-8, 0.2), ylim = c(54.7, 61)) +
geom_point(aes(x = lon, y = lat), lived) +
geom_label(aes(x = lon, y = lat, label = name, fill = years), lived) +
guides(fill = guide_legend(override.aes = aes(label = ""))) +
scale_fill_brewer(palette = "Oranges") +
theme(plot.background = element_rect(fill = "lightsteelblue1",
color = "steelblue",
size = 4),
legend.position = c(0, 1),
legend.justification = c(0, 1),
legend.title = element_blank(),
legend.background = element_blank())
2.7 Align labels
The labels are a bit crowded, so let’s set the horizontal and vertical alignment with hjust
and vjust
. Alignments of 0 are left- and bottom-justified, while alignments of 1 are right- and top-justified, but you can also use decimal values.
Code
ggplot() +
geom_sf(data = scotland_sf,
color = "darkseagreen4",
fill = "darkseagreen4") +
coord_sf(xlim = c(-8, 0), ylim = c(54.7, 61)) +
geom_point(aes(x = lon, y = lat), lived) +
geom_label(aes(x = lon, y = lat, label = name, fill = years), lived,
hjust = c(-.1, -.1, 1.1, 1.1),
vjust = c(.5, .8, .2, .5)) +
guides(fill = guide_legend(override.aes = aes(label = ""))) +
scale_fill_brewer(palette = "Oranges") +
theme(plot.background = element_rect(fill = "lightsteelblue1",
color = "steelblue",
size = 4),
legend.position = c(0, 1),
legend.justification = c(0, 1),
legend.title = element_blank(),
legend.background = element_blank())
2.8 Add Lines
Finally, let’s add the line that go from each place I’ve lived in order to the next one. My first idea was to use geom_line()
, but this put them in order based on x-axis value.
The labels are a bit small, so try bumping size
up to 6 (this is on an arbitrary scale; not a point size like the base_size
of a theme).
Code
ggplot() +
geom_sf(data = scotland_sf,
color = "darkseagreen4",
fill = "darkseagreen4") +
coord_sf(xlim = c(-8, 0), ylim = c(54.7, 61)) +
geom_point(aes(x = lon, y = lat), lived) +
geom_line(aes(x = lon, y = lat), lived) +
geom_label(aes(x = lon, y = lat, label = name, fill = years), lived,
size = 6,
hjust = c(-.1, -.1, 1.1, 1.1),
vjust = c(.5, .8, .2, .5)) +
guides(fill = guide_legend(override.aes = aes(label = ""))) +
scale_fill_brewer(palette = "Oranges") +
theme(plot.background = element_rect(fill = "lightsteelblue1",
color = "steelblue",
size = 4),
legend.position = c(0, 1),
legend.justification = c(0, 1),
legend.title = element_blank(),
legend.background = element_blank())
It was actually the geom_path()
function I was after, which connected the points in the order they were in my data frame. I also increased the size of the lines and decreased their alpha.
Code
ggplot() +
geom_sf(data = scotland_sf,
color = "darkseagreen4",
fill = "darkseagreen4") +
coord_sf(xlim = c(-8, 0), ylim = c(54.7, 61)) +
geom_path(aes(x = lon, y = lat), lived, size = 1.5, alpha = 0.6) +
geom_point(aes(x = lon, y = lat), lived) +
geom_label(aes(x = lon, y = lat, label = name, fill = years), lived,
size = 6,
hjust = c(-.1, -.1, 1.1, 1.1),
vjust = c(.5, .8, .2, .5)) +
guides(fill = guide_legend(override.aes = aes(label = ""))) +
scale_fill_brewer(palette = "Oranges") +
theme(plot.background = element_rect(fill = "lightsteelblue1",
color = "steelblue",
size = 4),
legend.position = c(0, 1),
legend.justification = c(0, 1),
legend.title = element_blank(),
legend.background = element_blank())