Подтвердить что ты не робот

Улучшить географические названия графств 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()
4b9b3361

Ответ 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 это означает, что размещение меток должно выполняться во время рендеринга - я понятия не имею, возможно ли это или что делать, чтобы достичь этого.