2017-05-26 1 views
2

Est-il possible d'avoir une couche dans ggplot qui agit comme un masque pour une couche ggmap? Here ils ont ajouté un polygone de pays au-dessus d'un ggmap.carte avec ggplot2 - créer un masque remplissant une boîte excluant un seul pays

enter image description here

Ce que je cherche est que le pays serait un « trou » dans une couche (alpha) qui couvre tout le pays, mais. D'une certaine manière l'inverse de l'exemple ci-dessus. Le code de cette réponse (avec transparence ajoutée et mise à jour pour utiliser geom_cartogram).

library(mapdata) 
library(ggmap) 
library(ggplot2) 
library(ggalt) 

# Get Peru map 
Peru <- get_map(location = "Peru", zoom = 5, maptype="satellite") 

# This is the layer I wish to put over the top 
coast_map <- fortify(map("worldHires", fill = TRUE, plot = FALSE)) 

# Subset data for Peru 
peru.coast <- subset(coast_map, region == "Peru") 

# Draw a graphic 
ggmap(Peru) + 
    geom_cartogram(data = peru.coast, map = peru.coast, aes(x = long, y = lat, map_id = region), 
      fill="white", color="grey", alpha=.1) + 
    xlim(-86, -68) + 
    ylim(-20, 0) + 
    labs(x = "Longitude", y = "Latitude") + 
    coord_map() + 
    theme_classic() 

Existe-t-il un moyen de remplir tout sauf un polygone dans ggplot2?

+0

pouvez-vous remplacer votre variable peru.coast avec '' 'sous-ensemble (coast_map, région! = "Pérou")' ''? – Nancy

+0

merci pour la Suggestion mais non, vous prendriez toutes les données dans WorldHires, mais cela ne couvre pas les océans.Une solution de contournement pourrait être de sélectionner tous les voisins et une ocea n shapefile, mais cela peut facilement devenir complexe. Je suis vraiment à la recherche d'une approche complémentaire ou inverse. – Lod

+0

Je ne comprends pas à quoi le résultat devrait ressembler ici - voulez-vous un trou au milieu (c'est-à-dire que le Pérou a reculé)? – lukeA

Répondre

1

Existe-t-il un moyen de remplir tout sauf un polygone dans ggplot2?

Cette méthode peut être un peu peu orthodoxe, mais de toute façon:

library(mapdata) 
library(ggmap) 
library(ggplot2) 
library(raster) 
ggmap_rast <- function(map){ 
    map_bbox <- attr(map, 'bb') 
    .extent <- extent(as.numeric(map_bbox[c(2,4,1,3)])) 
    my_map <- raster(.extent, nrow= nrow(map), ncol = ncol(map)) 
    rgb_cols <- setNames(as.data.frame(t(col2rgb(map))), c('red','green','blue')) 
    red <- my_map 
    values(red) <- rgb_cols[['red']] 
    green <- my_map 
    values(green) <- rgb_cols[['green']] 
    blue <- my_map 
    values(blue) <- rgb_cols[['blue']] 
    stack(red,green,blue) 
} 
Peru <- get_map(location = "Peru", zoom = 5, maptype="satellite") 
data(wrld_simpl, package = "maptools") 
polygonMask <- subset(wrld_simpl, NAME=="Peru") 
peru <- ggmap_rast(Peru) 
peru_masked <- mask(peru, polygonMask, inverse=T) 
peru_masked_df <- data.frame(rasterToPoints(peru_masked)) 
ggplot(peru_masked_df) + 
    geom_point(aes(x=x, y=y, col=rgb(layer.1/255, layer.2/255, layer.3/255))) + 
    scale_color_identity() + 
    coord_quickmap() 

enter image description here

Via this, this et this questions/réponses.


Ce que je cherche est l'environnement avec un remplissage transparent couche et le Pérou avec alpha = 1

Si la première pensée est ce facile. Cependant, alors j'ai vu et je me suis souvenu que geom_polygon n'aime pas beaucoup les polygones avec des trous. Heureusement, geom_polypath du paquet ggpolypath fait. Cependant, il affichera une erreur "" dans grid.Call.graphics (L_path, x $ x, x $ y, index, commutateur (x $ rule, winding = 1L ... "Erreur avec extension de panneau par défaut ggmap s).

vous pouvez faire

library(mapdata) 
library(ggmap) 
library(ggplot2) 
library(raster) 
library(ggpolypath) ## plot polygons with holes 
Peru <- get_map(location = "Peru", zoom = 5, maptype="satellite") 
data(wrld_simpl, package = "maptools") 
polygonMask <- subset(wrld_simpl, NAME=="Peru") 
bb <- unlist(attr(Peru, "bb")) 
coords <- cbind(
    bb[c(2,2,4,4)], 
    bb[c(1,3,3,1)]) 
sp <- SpatialPolygons(
    list(Polygons(list(Polygon(coords)), "id")), 
    proj4string = CRS(proj4string(polygonMask))) 
sp_diff <- erase(sp, polygonMask) 
sp_diff_df <- fortify(sp_diff) 

ggmap(Peru,extent="normal") + 
    geom_polypath(
    aes(long,lat,group=group), 
    sp_diff_df, 
    fill="white", 
    alpha=.7 
) 

enter image description here

+0

merci beaucoup, je vais regarder de plus près à la fois le code et les références. Probablement ma question aurait été plus précise, demandant s'il est possible de définir un masque vectoriel comme l'inverse des limites de la toile moins le polygone. – Lod

+0

@Lod Peut-être que c'est parce que je travaille dans le marketing, mais j'aurais demandé juste quelque chose comme "comment remplir tout sans un polygone au milieu". Je ne comprends pas les choses comme "masque vectoriel" ou "inverses des limites de la toile". Il suffit d'écrire avec un enfant à la place d'un professeur. ;-) – lukeA