Estou tentando exibir um planisfério usando um mapa da biblioteca rnaturalearth e quero adicionar alguns eixos X e Y em cada lado do meu planisfério. Consegui configurar corretamente os eixos Y, mas não consigo encontrar uma maneira de configurar corretamente o eixo X. Aqui está o resultado que obtive até agora:
Como você pode ver, a largura do eixo X é igual à largura do planisfério na latitude 0°, mas eu quero que ele tenha a mesma largura que o planisfério na latitude 80°. Eu criei o resultado que quero obter na imagem a seguir (desculpem minhas péssimas habilidades com pintura) :
Lamento que você não consiga ver as linhas dos meridianos. Não sei por que a captura de tela não mostrou as linhas dos meridianos.
Agora vamos falar sobre meu código, aqui está a biblioteca que eu uso:
library(ggplot2)
library(dplyr)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)
library(readxl)
E aqui está meu código que gera tudo:
world <- ne_countries(scale = "medium", returnclass = "sf")
longitudes <- longitudes <- c(-180, -140, -100, -60, -20, 0, 20, 60, 100, 140, 180)
# Créer les données pour les labels de longitude (axe X)
bottomXAxis <- lapply(longitudes, function(x) {
st_sf(label = paste0(abs(x), '\u00b0'),
geometry = st_sfc(st_point(c(x, 0)), crs = 'WGS84'))
}) %>% bind_rows()
topXAxis <- lapply(longitudes, function(x) {
st_sf(label = paste0(abs(x), '\u00b0'),
geometry = st_sfc(st_point(c(x, 0)), crs = 'WGS84'))
}) %>% bind_rows()
nudgeXValues <- rep(0, length(longitudes))
# Créer les données pour les labels de latitude (axe Y)
leftYAxis <- lapply(c(-80, -60, -40, -20, 0, 20, 40, 60, 80), function(y) {
st_sf(label = paste0(abs(y), '\u00b0'),
geometry = st_sfc(st_point(c(-180, y)), crs = 'WGS84'))
}) %>% bind_rows()
rightYAxis <- lapply(c(-80, -60, -40, -20, 0, 20, 40, 60, 80), function(y) {
st_sf(label = paste0(abs(y), '\u00b0'),
geometry = st_sfc(st_point(c(180, y)), crs = 'WGS84'))
}) %>% bind_rows()
nudge_left_y <- c(-1.6e6, -1.2e6, -0.8e6, -0.4e6, -0.2e6, -0.4e6, -0.8e6, -1.2e6, -1.6e6)
nudge_right_y <- c(1.6e6, 1.4e6, 1e6, 0.6e6, 0.4e6, 0.6e6, 1e6, 1.4e6, 1.6e6)
# Affichage de la carte avec les labels de longitude et latitude
world %>%
ggplot() +
geom_sf(color = "black", linewidth = 0.1) +
geom_sf_text(data = topXAxis, aes(label = label), size = 3.5, color = 'black',
nudge_y = rep(9e6, length(topXAxis$label)),
nudge_x = nudgeXValues) +
geom_sf_text(data = bottomXAxis, aes(label = label), size = 3.5, color = 'black',
nudge_y = rep(-9e6, length(bottomXAxis$label)),
nudge_x = nudgeXValues) +
geom_sf_text(data = leftYAxis, aes(label = label), size = 3.5, color = 'black',
nudge_x = nudge_left_y) +
geom_sf_text(data = rightYAxis, aes(label = label), size = 3.5, color = 'black',
nudge_x = nudge_right_y) +
coord_sf(crs = "+proj=robin", expand = TRUE) +
theme_minimal() +
theme(axis.title = element_blank())
Tentei várias opções como scale_x_continous com xlim, mas não funcionou. Espero que alguém tenha a solução. Além disso, ainda sou iniciante em programação em R, então não hesitem se tiverem algum outro feedback sobre o meu código.
Obrigado !
Acho que isso chega perto:
geometry = st_sfc(st_point(c(x, bottom_long)), crs = "WGS84"))
para os rótulos inferioresSeu código não é ruim; ele poderia ser melhorado usando
seq()
sequências e funções auxiliares para evitar código repetitivo.