Search code examples
rggplot2labelggspatial

Labels not visible in basemap ggspatial :: geom_spatial_poimt


I am trying to make a map to indicate my research site. I managed to plot a basemap of the Barents Sea and indicate my research site with a red dot. Now I would like to add the country names "Svalbard" and "Norway", add "Barents sea" and the name of my research site "Hopen Deep". The only warning I get is: "Assuming crs = 4326 in stat_spatial_identity()". I have tried several suggestions but never seem to be able to plot the labels. They simply do not show up. Any idea of how I could fix this?

The code looks like this:

library(ggplot2)
library(ggOceanMaps)
library(ggspatial) #for data plotting

#MAP OF SVALBARD/NORWAY WITH HIGHLIGHTED HOPENDEEP SITE
dt <- data.frame(lon = 31.5, lat = 75.2) #N, E coordinates research site

# Create a data frame for labels
labels <- data.frame(
  location = c("Norway", "Svalbard", "Barents Sea", "Hopen Deep"),
  lon = c(10, 20, 30, 31.5),
  lat = c(60, 78, 75, 75.2)
)

basemap(limits = c(15, 40, 70, 80), bathymetry = TRUE, rotate = TRUE) + #rotate = TRUE rotates the map northward (straight)
  geom_text(data = labels, aes(x = lon, y = lat, label = location), color = "black", size = 10, nudge_y = -0.2) +
  ggspatial::geom_spatial_point(data = dt, aes(x = lon, y = lat), color = "red") 

I tried it with annotate, re-ordering layers, geom_label but this al did not seem to work. The labels simply do not show up. Anyone has any idea of what I am missing?


Solution

  • The problem is that the map data's co-ordinate reference system appears to be ESPG:3995, which are Northings/Eastings co-ordinates relative to a point halfway between Svalbard and Greenland. This is then further confounded by the rotate = TRUE. You could convert your chosen co-ordinates to the same CRS using sf:

    library(sf)
    
    # Create a data frame for labels
    labels <- data.frame(
      location = c("Norway", "Svalbard", "Barents Sea", "Hopen Deep"),
      lon = c(20, 20, 30, 31.5),
      lat = c(70, 78, 74, 75.2)
    )
    
    labels[2:3] <- do.call('rbind', lapply(seq(nrow(labels)), function(i) {
      st_point(c(labels$lon[i], labels$lat[i])) |>
        st_sfc(crs = 4326) |>
        st_sf() |>
        st_transform(crs = 3995) |>
        st_coordinates() |>
        as.data.frame()
    }))
    
    basemap(limits = c(10, 40, 70, 80), bathymetry = TRUE) +
      geom_text(data = labels, aes(x = lon, y = lat, label = location),
                color = "black", size = 8, nudge_y = -50000) +
      ggspatial::geom_spatial_point(data = dt, aes(x = lon, y = lat),
                                    color = "red") 
    

    enter image description here