2017-06-21 5 views
3

Ich habe es geschafft, eine Karte zu erstellen, aber ich muss ein Label für einen Staat (Ebene 2), die Unterteilungen (Ebene 3) enthält hinzufügen , anstatt jede Unterteilung zu kennzeichnen (nur für diesen Zustand). In den Daten "newpak" entsprechen Zeilen 641-664 diesem Zustand, gibt es eine Möglichkeit, nur einen Namen über diesen Zustand zu setzen.So beschriften Sie einen individuellen Status auf der Karte, während die anderen auf Unterteilung

library(dplyr) 
library(raster) 
library(sf) 
library(tidyverse) 
library(ggrepel) 
devtools::install_github("tidyverse/ggplot2", force = TRUE) 
library(ggplot2) 

pak <- getData("GADM",country="PAK",level=3) 

pak <- st_as_sf(pak) %>% 
    mutate(
    lon = map_dbl(geometry, ~st_centroid(.x)[[1]]), 
    lat = map_dbl(geometry, ~st_centroid(.x)[[2]])) 

ggplot(pak) + geom_sf() + geom_text(aes(label = NAME_3, x = lon, y = lat), size = 2) 

ind <- getData("GADM",country="IND",level=3) 

ind <- st_as_sf(ind) %>% 
    mutate(
    lon = map_dbl(geometry, ~st_centroid(.x)[[1]]), 
    lat = map_dbl(geometry, ~st_centroid(.x)[[2]])) 

jnk <- subset(ind, OBJECTID >= 641 & OBJECTID <= 664) 

newpak <- rbind(pak, jnk) 


regionalValues <- runif(165) # Simulate a value for each region between 0 and 1 

ggplot(newpak) + geom_sf(aes(fill = regionalValues)) + geom_text(aes(label = NAME_3, x = lon, y = lat), size = 2) 

enter image description here

+0

sehen Wollen Sie, dass die Grenzen sichtbar sind? Oder möchten Sie, dass die gesamte 'jnk'-Region ohne interne Grenzen angezeigt wird? – yeedle

+0

@yeedle Ich möchte die gesamte JNK-Region ohne interne Grenzen mit nur einem Label. – Researcher

Antwort

7

Hier ist eine komplette Lösung, die sf Paket.

library(raster) 
library(sf) 
library(tidyverse) 

# downlaod PAK data and convert to sf 
pak <- getData("GADM",country="PAK",level=3) %>% 
    st_as_sf() 

# download IND data, convert to sf, filter out 
# desired area, and add NAME_3 label 
jnk <- getData("GADM",country="IND",level=3) %>% 
    st_as_sf() %>% 
    filter(OBJECTID %>% between(641, 664)) %>% 
    group_by(NAME_0) %>% 
    summarize() %>% 
    mutate(NAME_3 = "Put desired region name here") 


regionalValues <- runif(142) # Simulate a value for each region between 0 and 1 

# combine the two dataframes, find the center for each 
# region, and the plot with ggplot 
pak %>% 
    select(NAME_0, NAME_3, geometry) %>% 
    rbind(jnk) %>% 
    mutate(
    lon = map_dbl(geometry, ~st_centroid(.x)[[1]]), 
    lat = map_dbl(geometry, ~st_centroid(.x)[[2]]) 
    ) %>% 
    ggplot() + 
    geom_sf(aes(fill = regionalValues)) + 
    geom_text(aes(label = NAME_3, x = lon, y = lat), size = 2) + 
    scale_fill_distiller(palette = "Spectral") 

Einige Anmerkungen:

  • benutzte ich sf::filter statt raster::subset die gewünschte Teilmenge der IND-Daten zu bekommen, weil ich es mehr idiomatische tidyverse Code fühlen.

  • Um Bereiche kombinieren mit sf können Sie gruppieren die verschiedenen Regionen durch eine gemeinsame Gruppe mit group_by und dann einfach summarize nennen. Dies ist die Methode, die ich in meiner obigen Lösung verwendet habe. Es gibt andere Funktionen in dem Paket sf, die ähnliche Ergebnisse erzielen, die es wert sind, betrachtet zu werden. Sie sind st_combine und st_union.

  • Mit st_centroid zum Zweck der Region Etiketten von der grafischen Darstellung ist nicht unbedingt die beste Methode für eine gute Lage für den Bereich Etiketten zu finden. Ich habe es benutzt, weil es am bequemsten ist. Sie können andere Methoden ausprobieren, einschließlich der manuellen Platzierung von Etiketten.

  • Ich habe die Füllpalette in eine abweichende Farbpalette geändert, weil ich denke, dass sie den Unterschied zwischen einer Region und der nächsten deutlicher zeigt. Sie können einige der verfügbaren Farbpaletten mit RColorBrewer::display.brewer.all()

+0

Danke, das ist sehr hilfreich bei der schmerzhaften Migration von sp. Ich bin mir nicht sicher, was sich seit dem Skript geändert hat, aber ich musste eine kleine Änderung von Auswahl (NAME_0, NAME_3, Geometrie)%>% zu Auswahl.sf (NAME_0, NAME_3, Geometrie)%>% vornehmen (dh mit der sf-Version des dplyr-Verbs) –

+0

Hmm, 'select' sollte' select.sf' automatisch unter der Haube auf dem sf-Objekt verwenden – yeedle

+0

dplyr :: select (dh einfache Auswahl) "... behält die Geometrie bei, unabhängig davon, ob sie ausgewählt ist oder nicht; um die Auswahl aufzuheben, führe zuerst as.data.frame durch, um dplyrs eigene Auswahl zuzulassen. " –

Verwandte Themen