ggplot 映射美学错误
ggplot mapping Aesthetics error
我正在尝试使用 ggplot 根据 @data 槽中的值绘制区域和标签。我的错误与问题 here, , and here 中的错误相同,但我无法将这些答案转化为我的问题。我可以从栅格包中的 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))
Regions defined for each Polygons
Regions defined for each Polygons
Error: Aesthetics must be either length 1 or the same as the data (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 进行映射。
"Pennsylvania" 文本条目过多是由于将所有 long
和 lat
的值提供给 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 的列表以找到面积最大的多边形或输入 hand-coded 坐标。 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)
使用 ggplot 解决我的问题仍然不太顺利。我现在已经切换到 plot 和 spplot,并且已经找到了如何在中心标记多边形和 Labpt 插槽,如下所示...invisible(text(getSpPPolygonsLabptSlots(PA), labels=as.character(PA$NAME_1), cex=0.5))
认为这可能对某人有所帮助。
如其他答案和评论中所述,修改 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()
这会导致很长(因此未显示)但准确的映射。这是由于默认比例对阿拉斯加的极端坐标的解释有点不正确。
scale_x_continuous
在 -190 和 -120 处稍微剪裁轴,可以获得更好的剪裁效果。
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 files and Kevin Johnson's blog post on Making Maps in R 绘制人口普查数据,这非常有帮助。人口普查形状文件具有不同的分辨率级别,因此如果您对阿拉斯加轮廓中存在的许多坐标挂断,5 米或 20 米的人口普查形状文件版本可能更易于管理。
我正在尝试使用 ggplot 根据 @data 槽中的值绘制区域和标签。我的错误与问题 here,
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))
Regions defined for each Polygons Regions defined for each Polygons Error: Aesthetics must be either length 1 or the same as the data (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 进行映射。
"Pennsylvania" 文本条目过多是由于将所有 long
和 lat
的值提供给 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 的列表以找到面积最大的多边形或输入 hand-coded 坐标。 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)
使用 ggplot 解决我的问题仍然不太顺利。我现在已经切换到 plot 和 spplot,并且已经找到了如何在中心标记多边形和 Labpt 插槽,如下所示...invisible(text(getSpPPolygonsLabptSlots(PA), labels=as.character(PA$NAME_1), cex=0.5))
认为这可能对某人有所帮助。
如其他答案和评论中所述,修改 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()
这会导致很长(因此未显示)但准确的映射。这是由于默认比例对阿拉斯加的极端坐标的解释有点不正确。
scale_x_continuous
在 -190 和 -120 处稍微剪裁轴,可以获得更好的剪裁效果。
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)
coordinates(AK)[1,]
提供最大岛屿的标签坐标,而 coordinates(AK)[2,]
是大陆的标签坐标。
为了进一步阅读,我正在使用 census shape files and Kevin Johnson's blog post on Making Maps in R 绘制人口普查数据,这非常有帮助。人口普查形状文件具有不同的分辨率级别,因此如果您对阿拉斯加轮廓中存在的许多坐标挂断,5 米或 20 米的人口普查形状文件版本可能更易于管理。