Это немного грязно, но вы могли бы сделать что-то вроде этого, чтобы построить невидимые точки на максимальной дальности для каждого города, чтобы сохранить шкалы одинаковыми ...
library(tidyverse)
ranges <- cities %>%
group_by(city) %>%
summarise(minlat=min(lat), #get limits for each city
maxlat=max(lat),
minlon=min(long),
maxlon=max(long)) %>%
mutate(rangelat=maxlat-minlat, #calculate range required for each
rangelon=maxlon-minlon,
centrelat=(maxlat+minlat)/2, #calculate centre point of plot
centrelon=(maxlon+minlon)/2) %>%
ungroup() %>%
mutate(bottom=centrelat-max(rangelat)/2,#calculate box size based on max range
top=centrelat+max(rangelat)/2,
left=centrelon-max(rangelon)/2,
right=centrelon+max(rangelon)/2)
ggplot()+
geom_polygon(data = cities, aes(long, lat, group = group),
color = "black", size = 2.5, fill = "grey", alpha = 1)+
geom_point(data=ranges, aes(x=left,y=bottom), alpha=0)+ #invisible bottom left point
geom_point(data=ranges, aes(x=right,y=top),alpha=0)+ #invisible top right point
facet_wrap(~city,scales = "free")