【问题标题】:ggplot mapping Aesthetics errorggplot映射美学错误
【发布时间】:2015-12-30 16:24:37
【问题描述】:

我正在尝试使用 ggplot 根据 @data 插槽中的值映射区域和标签。我的错误与问题hereherehere 中的相同,但我无法将这些答案转化为我的问题。我可以从 raster 包中的 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))

当我尝试这个时,我得到了美学错误(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,标签

我不知道为什么我必须将 $ 放在 geom_text 中并且已经存在数据调用,但是没有它它无法识别变量。我还尝试按照代码中的 OBJECTID 为 2 个 AK 多边形着色,但得到了相同的美学错误。

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

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

【问题讨论】:

  • 你想要的输出是什么?为什么要绘制这么多 geom_texts?
  • 您真的要在每个坐标处添加州名吗?这就是为什么你的情节看起来很奇怪。您可以查看annotate,而不是只添加一次标签。我无法重现您在 AK 不绘图时遇到的问题。如果您想用变量填充,您需要将填充移到 aes 中 - 有关示例,请参见 geom_polygon 的帮助页面。
  • 不,我不想在每个坐标处添加标签。我在一组状态上执行此操作,并希望每个多边形都有一个标签,在这种情况下只是 PA 多边形。我将研究“注释”。我尝试在新会话中运行我的代码,但仍然出现美学错误。我正在使用 3.2.2
  • 我已经能够使用annotate("text", x=-77, y=41, label = PA$NAME_1) 获得仅适用于 PA 单个多边形的注释,但无法获得多个多边形的标签,如 AK。
  • 状态对象没有中心属性吗?当我查看 str(PA) 时,在我看来 .. .. .. ..@ labpt : num [1:2] -77.8 40.9 行具有该值。 (看起来是为放置桌子而设计的。)

标签: r ggplot2 spatial aesthetics


【解决方案1】:

正如其他答案和 cmets 中提到的,修改 geom_text 是要进行的第一个更改。我的主要补充是使用coord_map(),它是ggplot2 的一部分。 coord_map() 为典型的经纬度映射正确缩放轴。

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)  

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

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

【讨论】:

    【解决方案2】:

    过多的“Pennsylvania”文本条目是由于将所有longlat 的值提供给geom_text 函数造成的。您需要切换到仅采用单个坐标的函数。制作 PA 对象后,我可以做到这一点,诚然这看起来像是一个 hack。 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)
    

    【讨论】:

    • 您可以使用sp::coordinates获取标签的质心坐标。
    【解决方案3】:

    使用 ggplot 解决我的问题仍然没有多大运气。我现在已经切换到 plot 和 spplot 并且发现了如何标记中心的多边形和 Labpt 槽,如下所示...invisible(text(getSpPPolygonsLabptSlots(PA), labels=as.character(PA$NAME_1), cex=0.5)) 认为这可能对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多