MorrisseyJ
MorrisseyJ

Reputation: 1271

Alternative to map_data('world') - Covers Antartica to -90

I am looking for a simple alternative to map_data('world') as a data set with which to easily draw the countries of the world. Ideally it's easily implementable with ggplot2.

The problem is that I am graphing some geographic points, some of which appear close to -90 (S). When I use map_data('world') to get my polygons, I see that Antarctica doesn't run all the way to -90 (lowest lat value for Antarctica is -85.19218 - see code below). Thus anything further south than that shows as if its off the map, which doesn't look great.

Here is an example of what I am talking about:

library('ggplot2') #Import library
world = map_data('world') #Get polygon data
data = data.frame(lat = -86, long = 0) #Create geographic data with southerly value

#plot
ggplot() +
  geom_polygon(data = world, 
               aes(y = lat, x = long, group = group), col = 'grey', fill = NA) +
  geom_point(data = data, 
             aes(y = lat, x = long), col = 'red')

Gives: enter image description here

You can see the limits of the Antarctic extent as follows:

library('dplyr')
world %>% 
  filter(region == 'Antarctica') %>% 
  select(lat) %>% 
  min()
[1] -85.19218

Thus the problem is not the projection, its the data set. Does anyone know an alternative easily available rendering of the countries that has Antarctica running to -90?

Upvotes: 1

Views: 601

Answers (2)

Dan Slone
Dan Slone

Reputation: 563

The {rnaturalearth} package has a good representation of Antarctica (and the other land masses too!) I have switched to using it for all my background mapping. This example:

world <-  rnaturalearth::ne_countries(returnclass = "sf")

map_crs <- st_crs(3031) # WGS 84 / Antarctic Polar Stereographic

ggplot() + geom_sf(data = world %>% st_transform(map_crs)) +
  coord_sf(datum = map_crs,  
           ylim = c(-3e6,3e6),  
           xlim = c(-3e6,3e6))

Produces this map - there is just a tiny sliver of unmapped Antarctica: Map of Antarctica

Upvotes: 0

mrhellmann
mrhellmann

Reputation: 5499

There isn't any data for ggplot2 to plot below about 85 degrees south in the world data as a polygon. Using geom_polygon also has the drawback of connecting the data from the far left (west) to the data on the far right(east).

To get around having the straight line above the red dot, use the sf package and geom_sf to plot spatial data.

I don't know of a good way to plot Antarctica along with the entire rest of the globe. If you are mostly interested in the southern pole & it's surroundings, an orthographic projection might work.

library(tidyverse)
library(rnaturalearth)

world <- map_data('world') #Get polygon data
data = data.frame(lat = -86, long = 0) #Create geographic data with southerly value

#plot
p_polygon <- ggplot() +
               geom_polygon(data = world, 
                            aes(y = lat, x = long, group = group), col = 'grey', fill = NA) +
               geom_point(data = data, 
                          aes(y = lat, x = long), col = 'red')

# use rnaturalearth package to get coastline data in the sf format
world_sf <- ne_coastline(returnclass = 'sf')

# use geom_sf to plot the data
p_sf <- ggplot(world_sf) + 
  geom_sf() +
  geom_point(data = data, aes(y = lat, x = long), col = 'red')

# geom_sf, using an orthographic projection
p_sf_ortho <- ggplot(world_sf) + 
  geom_sf() +
  geom_point(data = data, aes(y = lat, x = long), col = 'red') +
 coord_sf( crs= "+proj=ortho +lat_0=-80 +lon_0=90")  

# the three plots together
cowplot::plot_grid(p_polygon, p_sf, p_sf_ortho,
                   labels = c('polygon', 'sf', 'sf orthographic'))

Created on 2021-08-27 by the reprex package (v0.3.0)

Upvotes: 1

Related Questions