ggrepel: нанесение меток вне карты - PullRequest
1 голос
/ 20 апреля 2020

Я делаю карту крупнейших городов Китая с точки зрения населения, используя ggplot2.

Исходный набор данных находился в шейп-файле, поэтому я использовал readOGR для преобразования данных в векторный объект Spatial, а затем, используя fortify, превратил карту в фрейм данных, чтобы можно было использовать ggplot2.

My Основная проблема заключалась в том, что при использовании geom_label метки продолжали перекрывать друг друга, поэтому я переключился на geom_label_repel, но теперь некоторые метки городов размещаются вне карты. Есть ли способ заставить geom_label_repel сохранить метки внутри карты?

Ура!

library(rgdal)
library(raster)
library(ggplot2)

ctry_spdf <- readOGR(dsn=".",layer="COUNTRIES_ALL",verbose=F)
china<-subset(ctry_spdf,ctry_spdf@data$CNTRY_NAME=="China")
cities <- readOGR(dsn=".",layer="cities")

chinese_cities <- intersect(cities,china)

china_df<-fortify(china, region="OBJECTID")
china_ff <- merge(china_df, china@data, by.x = "id", by.y = "OBJECTID")

cities_df <- as(chinese_cities, "data.frame") 

plot_china<- c(geom_polygon(data=china_ff, aes(long, lat, group = group)))

plot_cities<-c(geom_point(data=cities_df,aes(x=POINT_X, y=POINT_Y,col="red")))

#plot_labels<-c(geom_label(data=cities_df,aes(x=POINT_X, y=POINT_Y,label=CITY_NAME))) --previous 
methodology overlapping

plot_labels<-c(geom_label_repel(
arrow = arrow(length = unit(0.03, "npc"), type = "closed", ends = "first"),
force = 10,
data=cities_df,aes(x=POINT_X, y=POINT_Y,label=CITY_NAME) ) )

ggplot()+plot_china+plot_cities+plot_labels+coord_equal() + labs(title = "China", x = "long", y = 
"lat", color = "City") +scale_color_manual(labels = c("Big Cities"), values = c("red")) 

См. Карту здесь

...