Pracuję z pakietem ggmap w R i jestem stosunkowo nowy w wizualizacjach danych geoprzestrzennych. Mam ramkę danych z jedenastoma parami szerokości i długości geograficznej, które chciałbym wydrukować na mapie, każda z etykietą. Oto dane manekina:Dynamiczna etykieta punktu danych Pozycjonowanie w ggmap
lat<- c(47.597157,47.656322,47.685928,47.752365,47.689297,47.628128,47.627071,47.586349,47.512684,47.571232,47.562283)
lon<-c(-122.312187,-122.318039,-122.31472,-122.345345,-122.377045,-122.370117,-122.368462,-122.331734,-122.294395,-122.33606,-122.379745)
labels<-c("Site 1A","Site 1B","Site 1C","Site 2A","Site 3A","Site 1D","Site 2C","Site 1E","Site 2B","Site 1G","Site 2G")
df<-data.frame(lat,lon,labels)
Teraz używam annotate
tworzyć etykiety punkt danych i wykreślić je na mapie;
map.data <- get_map(location = c(lon=-122.3485,lat=47.6200),
maptype = 'roadmap', zoom = 11)
pointLabels<-annotate("text",x=uniqueReach$lon,y=c(uniqueReach$lat),size=5,font=3,fontface="bold",family="Helvetica",label=as.vector(uniqueReach$label))
dataPlot <- ggmap(map.data) +
geom_point(data = uniqueReach,aes(x = df$lon, y = df$lat), alpha = 1,fill="red",pch=21,size = 6) + labs(x = 'Longitude', y = 'Latitude')+pointLabels
To daje wykres punktów danych
Jak widać, istnieją dwa punkty danych, które pokrywają około (-122.44,47.63), a ich etykiety również pokrywać. Teraz mogę ręcznie dodać przesunięcie do każdego punktu etykiety, aby etykiety nie zachodziły na siebie (patrz this post), ale nie jest to świetna technika, gdy trzeba wyprodukować wiele z tych wykresów dla różnych zestawów długości i szerokości geograficznej.
Czy jest sposób, w jaki mogę automatycznie zapobiegać nakładaniu się etykiet danych? Zdaję sobie sprawę, czy nakładanie się etykiet zależy od rzeczywistej wielkości figury, więc jestem otwarty na ustalenie rozmiaru figury w pewnych wymiarach, jeśli zajdzie taka potrzeba. Z góry dziękuję za wszelkie spostrzeżenia!
EDIT
Kolumnę zmodyfikowany kod za odpowiedź udzieloną przez Sandy Mupratt
# Defining function to draw text boxes
draw.rects.modified <- function(d,...){
if(is.null(d$box.color))d$box.color <- NA
if(is.null(d$fill))d$fill <- "grey95"
for(i in 1:nrow(d)){
with(d[i,],{
grid.rect(gp = gpar(col = box.color, fill = fill,alpha=0.7),
vp = viewport(x, y, w, h, "cm", c(hjust, vjust=0.25), angle=rot))
})
}
d
}
# Defining function to determine text box borders
enlarge.box.modified <- function(d,...){
if(!"h"%in%names(d))stop("need to have already calculated height and width.")
calc.borders(within(d,{
w <- 0.9*w
h <- 1.1*h
}))
}
generowania wykresu czynności:
dataplot<-ggmap(map.data) +
geom_point(data = df,aes(x = df$lon, y = df$lat),
alpha = 1, fill = "red", pch = 21, size = 6) +
labs(x = 'Longitude', y = 'Latitude') +
geom_dl(data = df,
aes(label = labels),
list(dl.trans(y = y + 0.3), "boxes", cex = .8, fontface = "bold"))
Jest to znacznie więcej r działka, ale z jedną nierozstrzygniętą kwestią. Zauważysz, że etykieta "Site 1E" zaczyna pokrywać się z punktem danych powiązanym z "Site 1A". Czy directlabele mają sposób radzenia sobie z etykietami nakładającymi się na punkty danych należących do innej etykiety?
Ostatnim pytaniem, które mam na ten temat, jest to, jak wykreślić kilka duplikatów etykiet za pomocą tej metody. Załóżmy, etykiety dla data.frame są takie same:
df$labels<-rep("test",dim(df)[1])
Kiedy użyć tego samego kodu, directlabels usuwa zduplikowane nazwy etykiet:
Ale chcę Każdy punkt danych, aby mieć etykietę "test". Jakieś sugestie?
Pakiet directlabels jest doskonałym narzędziem mieć. Dziękuję za sugestię. Używanie 'list (dl.trans (y = y + 0.2)' było kluczem do uzyskania pewnej kontroli nad położeniem etykiet przy jednoczesnym korzystaniu z funkcji geom_dl. Ten wykres byłby doskonały, z wyjątkiem sytuacji, gdy "Site 1A" etykieta pokrywa się ze słowem "Seattle" w podstawowej działce. Wszelkie sugestie dotyczące obejścia tego problemu byłyby najbardziej doceniane: – Archimeow
@JMeo, dodałem edycję –
Edytowałem kod za pomocą Twojego doskonałego rozwiązania.Miałem pytania uzupełniające (proszę o moje edycje) dotyczące tego, jak nie dopuścić do nakładania się pól tekstowych na sąsiednie punkty danych oraz jak drukować etykiety będące duplikatami między różnymi punktami danych. Jeszcze raz dziękuję za współpracę ze mną, ponieważ uczę się używać 'directlabels' – Archimeow