Улучшить географические названия графств ggplot & maps
Раньше я разместил вопрос о построении имен графства на карте с использованием ggplot и найденных карт ЗДЕСЬ. Мой первый подход состоял в том, чтобы использовать средства всех латов и длинных координат для каждого округа, как показано здесь:
![enter image description here]()
К счастью, у Andrie было 2 предложения по улучшению центрирования с использованием центра диапазонов, а затем с координатой coord_map() {, которая, по-видимому, поддерживает соотношение сторон). Это особенно показало центрирование:
![enter image description here]()
Я думаю, что это выглядит лучше, но все еще имеет некоторые трудности с проблемами перекрытия. Я надеюсь на дальнейшее улучшение центрирования (в той же теме Джастин предложил использовать kmeans). Я в порядке с вращающимся текстом, если это необходимо, но я надеюсь, что имена будут центрированы и повернуты, если необходимо (они выходят за границы графства), чтобы наилучшим образом отображать имена графств на карте.
Любые идеи?
library(ggplot2); library(maps)
county_df <- map_data('county') #mappings of counties by state
ny <- subset(county_df, region=="new york") #subset just for NYS
ny$county <- ny$subregion
p <- ggplot(ny, aes(long, lat, group=group)) + geom_polygon(colour='black', fill=NA)
#my first approach to centering
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny, FUN=mean)
ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour='black', fill=NA) +
geom_text(data=cnames, aes(long, lat, label = subregion), size=3)
#Andrie much improved approach to centering
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny,
FUN=function(x)mean(range(x)))
ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour='black', fill=NA) +
geom_text(data=cnames, aes(long, lat, label = subregion), size=3) +
coord_map()
Ответы
Ответ 1
Как я проработал вчера вечером в Talk Stats (ссылка), это на самом деле довольно легко (как продукт часов, которые я провел рано утром!), если вы используете пространственный пакет R (sp). Я проверил некоторые из своих других функций, чтобы создать объект SpatialPolygons, для которого вы можете использовать координаты, чтобы вернуть центроид многоугольника. Я сделал это только для одного округа, но точка метки объекта Polygon (S4) соответствовала центру. Предполагая, что это верно, тогда метки точек объектов Polygon являются центроидами. Я использую этот небольшой процесс для создания кадра данных центроидов и использования их для построения на карте.
library(ggplot2) # For map_data. It just a wrapper; should just use maps.
library(sp)
library(maps)
getLabelPoint <- # Returns a county-named list of label points
function(county) {Polygon(county[c('long', 'lat')])@labpt}
df <- map_data('county', 'new york') # NY region county data
centroids <- by(df, df$subregion, getLabelPoint) # Returns list
centroids <- do.call("rbind.data.frame", centroids) # Convert to Data Frame
names(centroids) <- c('long', 'lat') # Appropriate Header
map('county', 'new york')
text(centroids$long, centroids$lat, rownames(centroids), offset=0, cex=0.4)
Это не будет работать для каждого многоугольника. Очень часто процесс маркировки и аннотации в ГИС требует, чтобы вы настраивали метки и аннотации для тех особых случаев, которые не соответствуют автоматическому (систематическому) подходу, который вы хотите использовать. Подход кода-look-recode, который мы рассмотрим, не подходит. Лучше включить проверку того, что метка заданного размера для данного участка будет вписываться в многоугольник; если нет, удалите его из записи текстовых меток и вручную вставьте его позже, чтобы он соответствовал ситуации - например, добавьте линию лидера и добавьте комментарий в сторону многоугольника или поверните метку сбоку, как было показано в другом месте.
Ответ 2
Я думаю, что самый простой ответ на этот вопрос - Андри уже решил большую часть ручной работы. Остальное должно быть дополнено некоторыми хорошими методами настройки и просмотра. Когда вы смотрите на сюжет после внушения Андри, большинство из них прилично, за исключением некоторых досадных мест размещения, которые можно улучшить с помощью лат/длинного изменения или поворота. У меня есть пример для суфлока (внизу справа) и herkimer (в центре), поскольку размещение суфлок может быть улучшено с помощью lat/long adjust и herkimer посредством вращения.
До: ![Before]()
cnames <- aggregate(cbind(long, lat) ~ subregion, data=ny,
FUN=function(x)mean(range(x))) #Andrie code
cnames[52, 2:3] <- c(-73, 40.855) #adjust the long and lat of poorly centered names
cnames$angle <- rep(0, nrow(cnames)) #create an angle column
cnames[22, 4] <- -90 #adjust the angle of atypically shaped
ggplot(ny, aes(long, lat)) +
geom_polygon(aes(group=group), colour='black', fill=NA) +
geom_text(data=cnames, aes(long, lat, label = subregion, colour=col,
angle=angle), size=3) + coord_map()
Это дает нам:
![enter image description here]()
Если кто-то не имеет лучшего способа, я буду отмечать этот ответ как правильный.
Ответ 3
Вы можете взглянуть на пакет directlabels
, это обеспечивает автоматическое размещение меток с использованием ряда алгоритмов, которые не перекрывают друг друга. Я не уверен, может ли он быть использован для решения вашей проблемы, но вы можете взглянуть.
Ответ 4
Существует библиотека маркировки PAL, которая, как представляется, делает именно то, что вы ищете, автоматически. Этот снимок экрана взят со своего веб-сайта:
![PAL website screenshot]()
Я не нашел для него R-интерфейс. Краткое руководство чтобы выполнить собственную интеграцию PAL в ваше любимое приложение GIS, говорит о том, что сама интеграция должна быть выполнимой. Однако в контексте ggplot2 это означает, что размещение меток должно выполняться во время рендеринга - я понятия не имею, возможно ли это или что делать, чтобы достичь этого.