Отформатируйте метки широты и долготы в ggplot

У меня есть карта ggplot, например:

library(ggmap)
ggmap(get_map())

Мне бы хотелось, чтобы метки оси были автоматически помечены как NS / WE: в приведенном выше случае, например, вместо lon -95.4 он должен показывать 95.4°E.

Я пытался связываться с scales пакет и использование scale_x_continuous а также scale_y_continuous варианты ярлыков и разрывов, но мне не удалось заставить его работать.

Было бы здорово иметь scale_y_latitude а также scale_x_longitude,

РЕДАКТИРОВАТЬ: Благодаря ответу @Jaap я получил следующее:

scale_x_longitude <- function(xmin=-180, xmax=180, step=1, ...) {
    ewbrks <- seq(xmin,xmax,step)
    ewlbls <- unlist(lapply(ewbrks, function(x) ifelse(x < 0, paste(x, "W"), ifelse(x > 0, paste(x, "E"),x))))
    return(scale_x_continuous("Longitude", breaks = ewbrks, labels = ewlbls, expand = c(0, 0), ...))
}
scale_y_latitude <- function(ymin=-90, ymax=90, step=0.5, ...) {
    nsbrks <- seq(ymin,ymax,step)
    nslbls <- unlist(lapply(nsbrks, function(x) ifelse(x < 0, paste(x, "S"), ifelse(x > 0, paste(x, "N"),x))))
    return(scale_y_continuous("Latitude", breaks = nsbrks, labels = nslbls, expand = c(0, 0), ...))
}

Который работает довольно хорошо. Но по какой-то причине моему R не нравится символ градуса перед кардинальной точкой... Он отображается в виде простой точки, например, долгота -24 становится 24..W

2 ответа

Решение

К сожалению, такого понятия, как scale_x_longitude или же scale_y_latitude еще. А пока вот обходной путь, в котором вы заранее указываете метки:

# load the needed libraries
library(ggplot2)
library(ggmap)

# get the map
m <- get_map(location=c(lon=0,lat=0),zoom=5)

# create the breaks- and label vectors
ewbrks <- seq(-10,10,5)
nsbrks <- seq(-10,10,5)
ewlbls <- unlist(lapply(ewbrks, function(x) ifelse(x < 0, paste(x, "°E"), ifelse(x > 0, paste(x, "°W"),x))))
nslbls <- unlist(lapply(nsbrks, function(x) ifelse(x < 0, paste(x, "°S"), ifelse(x > 0, paste(x, "°N"),x))))

# create the map
ggmap(m) +
  geom_blank() +
  scale_x_continuous(breaks = ewbrks, labels = ewlbls, expand = c(0, 0)) +
  scale_y_continuous(breaks = nsbrks, labels = nslbls, expand = c(0, 0)) +
  theme(axis.text = element_text(size=12))

который дает:


Чтобы получить степени в функциях, вы можете поднять o как верхний индекс (который обойдет необходимость в специальном символе):

scale_x_longitude <- function(xmin=-180, xmax=180, step=1, ...) {
  xbreaks <- seq(xmin,xmax,step)
  xlabels <- unlist(lapply(xbreaks, function(x) ifelse(x < 0, parse(text=paste0(x,"^o", "*W")), ifelse(x > 0, parse(text=paste0(x,"^o", "*E")),x))))
  return(scale_x_continuous("Longitude", breaks = xbreaks, labels = xlabels, expand = c(0, 0), ...))
}
scale_y_latitude <- function(ymin=-90, ymax=90, step=0.5, ...) {
  ybreaks <- seq(ymin,ymax,step)
  ylabels <- unlist(lapply(ybreaks, function(x) ifelse(x < 0, parse(text=paste0(x,"^o", "*S")), ifelse(x > 0, parse(text=paste0(x,"^o", "*N")),x))))
  return(scale_y_continuous("Latitude", breaks = ybreaks, labels = ylabels, expand = c(0, 0), ...))
}    

ggmap(m) +
  geom_blank() +
  scale_x_longitude(xmin=-10, xmax=10, step=5) +
  scale_y_latitude(ymin=-10, ymax=10, step=5) +
  theme(axis.text = element_text(size=12))

который дает следующую карту:

я использовал geom_blank просто чтобы проиллюстрировать желаемый эффект. Вы можете, конечно, использовать другие геом (например, geom_point) нанести ваши данные на карту.

Теперь вы можете использовать пакет metR .В нем естьscale_*_latitude()иscale_*_longitude()функции.

      # load the needed libraries
library(ggplot2)
library(ggmap)
library(metR) #new package

# get the map
m <- get_map(location=c(lon=0,lat=0),zoom=5)

# create the map
ggmap(m) +
  scale_x_longitude(breaks = seq(-10,10,5)) +
  scale_y_latitude(breaks = seq(-10,10,5))
#> Scale for x is already present.
#> Adding another scale for x, which will replace the existing scale.
#> Scale for y is already present.
#> Adding another scale for y, which will replace the existing scale.

Создано 28 ноября 2022 г. с репрексом v2.0.2

Другие вопросы по тегам