AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77227358
Accepted
pomatomus
pomatomus
Asked: 2023-10-04 14:50:16 +0800 CST2023-10-04 14:50:16 +0800 CST 2023-10-04 14:50:16 +0800 CST

Como combinar dois mapas em R?

  • 772

Preciso de sua ajuda e forneci os códigos de exemplo abaixo. Meu problema envolve colocar 'map2' em um quadrado no canto superior esquerdo de 'map1' e adicionar uma seta de 'map2' para um local específico em 'map1'. Pesquisei no site, mas os tópicos mais discutidos estão relacionados à fusão de duas camadas de dados.

Se você puder me ajudar, eu agradeceria muito.

library (tidyverse)
 library (rnaturalearth)
 world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
 
 map1<- ggplot(data = world) +
   geom_sf() +
   #annotation_scale(location = "bl", width_hint = 0.2) +
   #annotation_north_arrow(location = "tr", which_north = "true", 
   #                     pad_x = unit(0.83, "in"), pad_y = unit(0.02, "in"),
   #                   style = north_arrow_fancy_orienteering) +
   coord_sf(xlim = c(35, 48), ylim=c(12, 22))+
   xlab("Longtitude")+
   ylab("Latitude")
 
  

 map2<- ggplot(data = world) +
   geom_sf() +
   #annotation_scale(location = "bl", width_hint = 0.2) +
   #annotation_north_arrow(location = "tr", which_north = "true", 
   #                     pad_x = unit(0.83, "in"), pad_y = unit(0.02, "in"),
   #                   style = north_arrow_fancy_orienteering) +
   coord_sf(xlim = c(5, 45), ylim=c(5, 45))+
   xlab("Longtitude")+
   ylab("Latitude")

 map2 
  • 6 6 respostas
  • 109 Views

6 respostas

  • Voted
  1. Best Answer
    2023-10-04T15:37:31+08:002023-10-04T15:37:31+08:00

    Outra solução de patchwork seria destacar a região de interesse no mapa inserido. Isso para mim parece melhor do que uma flecha:

    library(patchwork)
    
    map1 + 
      theme(panel.background = element_rect(fill = "white")) +
      inset_element(map2 + 
                      annotate("rect", ymin = 12, ymax = 22,
                               xmin = 35, xmax = 48, color = "red", fill = NA) +
                      theme_void() + 
                      theme(plot.background = element_rect(fill = "white"),
                            panel.border = element_rect(fill = NA, linewidth = 2)), 
                    0, 0.6, 0.4, 0.98)
    

    insira a descrição da imagem aqui

    • 7
  2. bretauv
    2023-10-04T15:27:05+08:002023-10-04T15:27:05+08:00

    Você pode fazer isso com o incrível pacote patchworkque possui uma função inset_element(). Observe que mudei ligeiramente o tema para map2remover todas as marcações e rótulos dos eixos, mas você não precisa:

    library(tidyverse)
    library(rnaturalearth)
    library(patchwork)
    
    world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
    
    map1 <- ggplot(data = world) +
      geom_sf() +
      coord_sf(xlim = c(35, 48), ylim=c(12, 22))+
      xlab("Longtitude")+
      ylab("Latitude")
    
    map2 <- ggplot(data = world) +
      geom_sf() +
      coord_sf(xlim = c(5, 45), ylim=c(5, 45))+
      xlab("Longtitude")+
      ylab("Latitude") +
      theme_void() +
      theme(
        panel.border = element_rect(color = "black", fill = "transparent")
      )
    
    map1 + inset_element(map2, left = 0.05, bottom = 0.6, right = 0.3, top = 1)
    

    • 4
  3. Till
    2023-10-04T15:30:05+08:002023-10-04T15:30:05+08:00

    O cowplotpacote pode ser montado ggplotde várias maneiras. ggplot::annotate()pode ser usado para desenhar uma seta no topo do gráfico.

    O exemplo abaixo é plotado map1primeiro. Além disso e no canto superior esquerdo, adicionamos um retângulo vazio, a “tela” para map2. Finalmente, adicionamos a seta com annotate(). Você provavelmente desejará ajustar as coordenadas e tamanhos dos elementos.

    Pode ser útil fixar as dimensões do gráfico em um quadrado para tornar o posicionamento dos elementos consistente. Você pode fazer isso usando ggsave()o mesmo valor de altura e largura.

    library(cowplot)
    
    ggdraw(clip = "on") +
      draw_plot(map1 + theme_void()) +
      draw_grob(
        grid::rectGrob(),
        x = 0.08,
        y = .8,
        width = .2,
        height = .2
      ) +
      draw_plot(
        map2 + theme_void(),
        x = 0.08,
        y = .8,
        width = .2,
        height = .2
      ) +
      annotate(
        "segment",
        x = 0.28,
        xend = .55,
        y = 0.8,
        yend = 0.2,
        colour = "orange",
        linewidth = 2,
        arrow = arrow()
      )
    

    • 4
  4. Maël
    2023-10-04T15:40:49+08:002023-10-04T15:40:49+08:00

    Você pode usar ggmagnify:geom_magnify

    remotes::install_github("hughjonesd/ggmagnify")
    library(ggmagnify)
    
    from <- c(xmin = 35, xmax = 48, ymin = 12, ymax = 22)
    to <- c(xmin = 51, xmax = 88, ymin = -20, ymax = 10)
    
    ggplot(data = world) +
      geom_sf() +
      coord_sf(xlim = c(35, 89), ylim=c(-20, 25))+
      xlab("Longitude")+
      ylab("Latitude") + 
      theme_bw() +
      ggmagnify::geom_magnify(from = from, to = to, expand = 0)
    

    insira a descrição da imagem aqui

    • 4
  5. asd-tm
    2023-10-04T15:34:57+08:002023-10-04T15:34:57+08:00

    Aqui está uma gridopção de pacote:

    library(grid)
    
    zoomed = viewport(
      x = .2,
      y = .8,
      width = .4,
      height = .4
    )
    regular = viewport(
      x = .5,
      y = .5,
      width = 1.0,
      height =1.0
    )
    
    grid.newpage()
    
    print(map1, vp = regular)
    print(map2, vp = zoomed)
    
    grid.lines(x=c(0.6, 0.35),
                  y=c(0.4,0.78),
                  gp=gpar(col=1:5, lwd=3),
               arrow = grid::arrow()
    )
    

    insira a descrição da imagem aqui

    Eu acho que você precisará suprimir os rótulos dos eixos x e na janela de visualização ampliada (ajustando map2), mas isso não é um problema, é?

    • 2
  6. mweylandt
    2023-10-04T15:48:16+08:002023-10-04T15:48:16+08:00

    Apenas adicionando uma cowplotopção:

    final <-
      ggdraw(map1) +
      draw_plot(map2, x = 0.7, y = .63, width = .3, height = .3)+ 
      geom_segment(aes(x = 0.92, y = 0.75, xend = 0.5, yend = 0.4),    
                   arrow = arrow(length = unit(0.5, "cm"))) 
    
    
    
    

    insira a descrição da imagem aqui

    Isso é um pouco chato porque você não pode usar as coordenadas originais como faria com o patchwork, então são necessárias algumas tentativas e erros - mas não consegui descobrir uma maneira com o patchwork de fazer a seta ir da inserção para o mapa geral e ser visível em ambas as camadas.


    Devo observar que editei o mapa inserido para não ter legendas e ter borda:

    map2<- ggplot(data = world) +
      geom_sf() +
      #annotation_scale(location = "bl", width_hint = 0.2) +
      #annotation_north_arrow(location = "tr", which_north = "true", 
      #                     pad_x = unit(0.83, "in"), pad_y = unit(0.02, "in"),
      #                   style = north_arrow_fancy_orienteering) +
      coord_sf(xlim = c(5, 45), ylim=c(5, 45))+
    theme_void() + 
      theme(panel.border = element_rect(color = "black", linewidth=1, fill = NA))
    map2 
    
    • 0

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve