ggplot mapping美学错误

时间:2015-12-30 16:24:37

标签: r ggplot2 spatial aesthetics

我正在尝试使用ggplot根据@data插槽中的值映射区域和标签。我的错误与问题hereherehere中的错误相同,但我无法将这些答案转换为我的问题。我可以从光栅包中的getData绘制美国地图中的状态,但是从那里遇到麻烦。举个例子,这些是我试过的数据集(我列出了包,因为我认为它们可能与问题有关)...

library(rgdal)
library(raster)
library(ggplot2)
library(maps)
library(maptools)
library(ggmap) # used for theme_nothing() later    
us <- getData("GADM",country="USA",level=1)
PA <- us[us$NAME_1 == 'Pennsylvania',]
AK <- us[us$NAME_1 == 'Alaska',]

当我尝试这个时,我得到一个时髦的地图(PA是一个多边形)。

ggplot(data=PA, aes(long, lat)) +
 geom_polygon(aes(group=group), color='black', fill=NA) +
 geom_text(data=PA, aes(long, lat, label = PA$NAME_1))

enter image description here

当我尝试这个时,我得到了美学错误(AK由2个多边形组成)。

ggplot(data=AK, aes(long, lat)) +
 geom_polygon(aes(group=group), color='black', fill=NA) +
 geom_text(data=AK, aes(long, lat, label = AK$NAME_1))
  

为每个多边形定义的区域   为每个多边形定义的区域   错误:美学必须是长度1或与数据相同(816071):x,y,label

我不确定为什么我必须将geom_text中的$放在已存在的数据调用中,但它没有识别变量。我也尝试用这个代码中的OBJECTID对2个AK多边形进行着色,但是得到了相同的美学错误。

ggplot(data=AK, aes(long, lat)) +
 geom_polygon(aes(group=group), color='black', fill=AK$OBJECTID)

感谢您的任何见解。我真的想更频繁地使用R进行映射。

3 个答案:

答案 0 :(得分:1)

正如其他答案和评论中所提到的,修改geom_text是第一次改变。我的主要补充是coord_map()的使用,它是ggplot2的一部分。 coord_map()正确缩放典型lat-long映射的轴。

ggplot(data=AK, aes(long, lat)) +
  geom_polygon(aes(group=group), 
               color = "black", 
               fill = NA, 
               alpha = 0.2) + 
  coord_map()

这导致非常长(因此未示出)但准确的映射。这是因为阿拉斯加的极端坐标被默认比例解释得有点不合适。

在-190和-120处用scale_x_continuous对轴进行一点剪裁可以获得更好的裁剪。

ggplot(data=AK, aes(long, lat)) +
  geom_polygon(aes(group=group), 
               color = "black", 
               fill = "darkgreen", 
               alpha = 0.2) + 
  coord_map()+
  scale_x_continuous(limits = c(-190, -120)) +
  annotate(geom = "text", 
           x = coordinates(AK)[2, 1], # note: [2,] refers to mainland label 
           y = coordinates(AK)[2, 2], 
           label = AK$NAME_1[1],
           size = 10)  

Alaska Plot 请注意,对于阿拉斯加州而言需要选择的标签坐标与宾夕法尼亚州略有不同,因为阿拉斯加州的data.frame包含两个对象。 coordinates(AK)[1,]提供最大岛屿的标签坐标,coordinates(AK)[2,]是大陆的标签坐标。

为了进一步阅读,我在使用census shape filesKevin Johnson's blog post on Making Maps in R对人口普查数据进行映射时非常有帮助。人口普查形状文件具有不同的分辨率级别,因此如果您有阿拉斯加大纲中存在的许多坐标,那么5米或20米的人口普查形状文件版本可能更易于管理。

答案 1 :(得分:0)

&#34;宾夕法尼亚州&#34;文本条目是由向geom_text函数提供所有longlat的值引起的。您需要切换到仅采用单个坐标的函数。在制作PA对象后,我可以做到这一点,这无疑是一个黑客攻击。 S4对象类应该有适当的提取器方法,但我在?SpatialPolygonsDataFrame帮助页面和链接中搜索,但没有找到labpt插槽的提取器。 (然后@aosmith填写了那个空白,我查找了如何将纵横比设置为1.0):

plot(PA)
text(x= PA@polygons[[1]]@Polygons[[1]]@labpt[1],   
     y=PA@polygons[[1]]@Polygons[[1]]@labpt[2], 
     label=PA$NAME_1)

我尝试绘制阿拉斯加物体,但我的R会话挂断了。 AK是一个相当复杂的空间物体,拥有所有这些岛屿。当您查看结构时,您会看到超过2个多边形:

..@ polygons   :List of 2
  .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
  .. .. .. ..@ Polygons :List of 4147

您可能需要循环遍历4147列表才能找到面积最大的多边形或放入手工编码的坐标。在PA上进行此绘图工作的ggplot版本可能从此开始(尽管需要修正宽高比):

ggplot(data=PA, aes(long, lat)) +
 geom_polygon(aes(group=group), color='black', fill=NA) + 
 annotate(geom="text", x=coordinates(PA)[1], y=coordinates(PA)[2], label = PA$NAME_1) + 
 coord_fixed(ratio=1)

enter image description here

答案 2 :(得分:0)

使用ggplot解决我的问题仍然没有多少运气。我现在已经切换到plot和spplot,并且已经找到了如何在中心和Labpt插槽中标记多边形... var entity = { id: data.cluster_number + '_' + point.id, name: point.id, position: Cesium.Cartesian3.fromDegrees(point.lon, point.lat), billboard: { image: 'assets/img/point.png', color: color, rotation: -1 * toRadians(point.heading), scale: point.size * 0.07 } }; if (!angular.isDefined(viewer.entities.getById(entity.id))) { viewer.entities.add(entity); } 认为这可能有助于某人。