2017-10-20 19 views
1

J'ai une trame de données de lat lons qui entoure un point central. Les lat lons représentent deux groupes. Les groupes sont représentés avec un 1 ou un 0. Je peux tracer autour du point central avec différentes formes et les couleurs, mais alors je voudrais que les couleurs soient plus distinctes. Je voudrais aussi tracer deux cercles autour des points, 300 mètres et 600 mètres respectivement. J'ai essayé de travailler avecTracer deux cercles autour du point central des données

Plot circle with a certain radius around point on a map in ggplot2

mais ai eu aucune chance

un petit échantillon ressemble à ceci

lat <- c(42.99052, 42.99085, 42.99046, 42.99081, 42.99197, 42.99122, 42.99154,42.99161, 42.99102, 42.99014, 42.98966, 42.99091, 42.99092, 42.99114 ,42.99000) 
lon <-c(78.69961, -78.69871, -78.69878, -78.69868, -78.69825, -78.69929, -78.69784, -78.69960, -78.69904, -78.69918, -78.69998, -78.69746, -78.70145, -78.70020, -78.70010) 
response <- c(0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1) 
data <- data.frame(lat, lon, response) 

Mon point central est

(42.990707, -78.698899) 

Je reçois mon carte sans cercles et couleurs distinctes comme ceci

library(ggplot2) 
library(ggmap) 
library(viridis) 

#getting map 

mapgilbert <- get_map(location = c(lon = -78.698899 , lat=42.990707), zoom = 17, 
        maptype = "terrain", scale = 2) 

ggmap(mapgilbert) + 
    geom_point(data = data, aes(x = lon, y = lat, color = response , alpha = 1, fill = response), 
      size = 2, shape = response) + 
    guides(fill = FALSE, alpha = FALSE, size = FALSE) + 
    scale_color_viridis(begin = 0, end = .7) 

toute aide serait appréciée.

+0

Je vous recommande de suivre cette réponse de la question que vous lié à: https://stackoverflow.com/a/34187878/ 7446435 Vous devrez peut-être en apprendre un peu plus sur les projections, mais c'est en gros la façon la plus simple d'obtenir exactement ce dont vous avez besoin. – Jul

+0

@ Mikel Arnaiz, pourquoi dessinez-vous des cercles? ;-) –

Répondre

0

J'ai obtenu la solution en modifiant la réponse dans

Plot circle with a certain radius around point on a map in ggplot2

center_df<-data.frame(ID=c(1),lon=c(-78.698899),lat=c(42.990707)) 

make_circles <- function(centers, radius, nPoints = 500){ 
    # centers: the data frame of centers with ID 
    # radius: radius measured in kilometer 
    # 
    meanLat <- mean(centers$lat) 
    # length per longitude changes with lattitude, so need correction 
    radiusLon <- radius /111/cos(meanLat/57.3) 
    radiusLat <- radius/111 
    circleDF <- data.frame(ID = rep(centers$ID, each = nPoints)) 
    angle <- seq(0,2*pi,length.out = nPoints) 

    circleDF$lon <- unlist(lapply(centers$lon, function(x) x + radiusLon * cos(angle))) 
    circleDF$lat <- unlist(lapply(centers$lat, function(x) x + radiusLat * sin(angle))) 
    return(circleDF) 
} 



myCircles <- make_circles(center_df, 0.2) 
myCircles2 <- make_circles(center_df, 0.1) 
mapgilbert2<- get_map(location = c(lon = -78.70000 , lat=42.991107), zoom = 16, 
        maptype = "terrain", scale = 2) 

ggmap(mapgilbert2)+ 
geom_point(data = data, aes(x = lon, y = lat, fill=as.factor(exposure) , alpha = 1), size = 2, pch=21)+ 
guides(fill=FALSE, alpha=FALSE, size=guide_legend)+ 
scale_color_viridis(begin = 0, end = .7)+ 
geom_point(data=myCircles,aes(x=lon,y=lat), color='red')+ 
geom_point(data=myCircles2,aes(x=lon,y=lat), color='blue')+ 
scale_fill_manual(values=c("purple", "green"))