改进居中县名ggplot和地图

Tyl*_*ker 14 geocoding r ggplot2

早期我发布了一个关于使用ggplot在地图上绘制县名的问题以及在此处找到的地图.我的第一种方法是采用每个县的所有纬度和长坐标的方法,如下所示: 在此输入图像描述

值得庆幸的是,Andrie提出了两个建议,即使用范围中心改善居中,然后是coord_map(){这似乎可以保持宽高比正确}.这在很大程度上改善了中心位置,如下所示: 在此输入图像描述

我认为这看起来更好,但在重叠问题上仍然存在一些困难.我希望进一步提高中心性(在同一个线程中Justin提出了一个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's 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()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ich 8

当我昨晚在Talk Stats(链接)上解决这个问题时,如果你使用R space package(sp),它实际上很容易(作为我在凌晨花费的时间的产物!).我测试了他们的一些其他函数来创建一个SpatialPolygons对象,您可以使用坐标来返回多边形质心.我只是做了一个县,但标注点一的多边形(S4)对象匹配的重心.假设这是真的,那么Polygon对象的标签点就是质心.我使用这个小过程来创建质心的数据框并使用它们在地图上绘图.

library(ggplot2)  # For map_data. It's 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)
Run Code Online (Sandbox Code Playgroud)

这对每个多边形都不适用.通常,GIS中的标注和注释过程要求您为那些不适合您想要使用的自动(系统)方法的特殊情况调整标签和注释.我们对此采取的代码 - 重新编码方法并不恰当.最好包括检查给定绘图的给定大小的标签是否适合多边形; 如果没有,请将其从文本标签的记录中删除,然后手动插入以适应这种情况 - 例如,在多边形的一侧添加引线和注释,或者将标签侧向翻转,如其他地方所示.