r - 当 tmap 工作正常时,如何解决 ggplot 中缺少变量的问题?
问题描述
我有一个很大的空间数据框,head
信息在这里:
class : SpatialPolygonsDataFrame
features : 6
extent : 1268821, 1610480, 4828587, 5485976 (xmin, xmax, ymin, ymax)
crs : +proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +units=m +no_defs
variables : 3
names : TA2013_label, TimaruID, DistrictShortNames
min values : Ashburton District, 0, Ashburton
max values : Dunedin City, 0, Dunedin City
正如标题中所建议的,我有:SouthIslandTAs@data@TA2013_label
、、SouthIslandTAs@data@TimaruID
和SouthIslandTAs@data@DistrictShortNames
。TA2013_label
是一个有 23 个级别的因子,TimaruID
是数字 (0,1),DistrictShortNames
是字符。以前,数据包含新西兰所有地区地方当局的标签。我删除了北岛数据并将因子水平的数量减少到南岛剩余的 23 个。
我无法在ggplot
. tmap
但是,它与包的关系很好。但是后者在另存为 PDF 时会在绘图周围创建大的白色边距,我不知道如何删除这些边距,因此转移到ggplot
.
这是代码tmap
:
tm_shape(SouthIslandTAs) + tm_polygons("TimaruID", group= "TA2013_label", border.col="grey", style = "jenks",
palette = "Greens") +
tm_layout(legend.show = FALSE) +
tm_text("DistrictShortNames", size=.6, col= "black")
我得到了一张南岛 (NZ) 领土当局的地图,其中 Timaru 区显示为深绿色,与其他 TA 的浅绿色相比。
但我无法让代码在ggplot
.
我努力了:
ggplot(data = SouthIslandTAs, aes(x = long, y = lat, fill = TA2013_label, group = group)) +
geom_polygon()
Regions defined for each Polygons
Error in FUN(X[[i]], ...) : object 'TA2013_label' not found
和
ggplot() +
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = group), fill = TA2013_label, color = "red")
Regions defined for each Polygons
Error in FUN(X[[i]], ...) : object 'TA2013_label' not found
和
ggplot() +
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = TA2013_label), fill = TimaruID, color = "red")
Error in layer(data = data, mapping = mapping, stat = stat, geom = GeomPolygon, :
object 'TimaruID' not found
和
ggplot() +
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = TA2013_label), fill = "TimaruID", color = "red")
Regions defined for each Polygons
Error in FUN(X[[i]], ...) : object 'TA2013_label' not found
认为这可能是缺少的问题@data
,我尝试将其添加并得到以下错误(并且没有情节):
ggplot(data = SouthIslandTAs, aes(x = long, y = lat, fill = data@TA2013_label, group = group)) +
geom_polygon()
Regions defined for each Polygons
Error in FUN(X[[i]], ...) :
trying to get slot "TA2013_label" from an object of a basic class ("function") with no slots
我可以获得基本的绘图输出:
ggplot() + geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = group))
和
ggplot() +
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = group), fill = NA, color = "red")
但我对这两个都收到相同的警告:
Regions defined for each Polygons
我不明白为什么tmap
数据很好,但ggplot
不是。我没有收到任何错误或警告tmap
。
解决方案
如果没有数据集的可重现示例,很难确定问题的解决方案,但也许您可以在将数据ggplot2
转换为 sf 对象后绘制数据,然后使用geom_sf
:
library(sf)
library(sp)
library(ggplot2)
SF_Obj <- st_as_sf(SouthIslandTAs, fill = TRUE, plot = FALSE)
ggplot()+ geom_sf(data = SouthIslandTAs, aes(fill = TA2013_label))
这是一个使用raster
包中的美国地图的示例:
States <- raster::getData("GADM", country = "United States", level = 1)
ggplot() + geom_polygon(data = States, aes(x=long, y = lat, group = group, fill = NAME_1))
我得到和你一样的错误:
FUN(X[[i]], ...) 中为每个多边形定义的区域错误:找不到对象“NAME_1”
但是当我这样做时:
library(sf)
library(sp)
library(ggplot2)
library(dplyr)
sf_states <- sf::st_as_sf(States, plot = FALSE, fill = TRUE)
sf_states %>% filter(!(NAME_1 %in% c("Alaska","Hawaii"))) %>%
ggplot() + geom_sf(aes(fill = NAME_1), show.legend = FALSE)
我得到:
分配特定的填充颜色
要从sf
对象开始分配特定颜色,您可以创建一个指定了一些颜色名称的新列,然后使用scale_fill_identity
:
library(sf)
library(sp)
library(ggplot2)
library(dplyr)
sf_states %>% filter(!(NAME_1 %in% c("Alaska","Hawaii"))) %>%
mutate(COLOR = ifelse(NAME_1 %in% c("Oregon","Florida"),"green","red")) %>%
ggplot() + geom_sf(aes(fill = COLOR), show.legend = FALSE)+
scale_fill_identity()
如果您更喜欢根据国家/地区填写 0 和 1,则可以通过以下方式获得相同的图:
sf_states %>% filter(!(NAME_1 %in% c("Alaska","Hawaii"))) %>%
mutate(COLOR = ifelse(NAME_1 %in% c("Oregon","Florida"),1,0)) %>%
ggplot() + geom_sf(aes(fill = as.factor(COLOR)), show.legend = FALSE)+
scale_fill_manual(values = c("red","green"))
它回答了你的问题吗?如果没有,请考虑提供您的数据集的可重现示例
推荐阅读
- php - 如何使用 PhpSpreadsheet 将单元格设置为 TRUE|FALSE?
- html - 数据路由到剃刀页面html上的模式
- rest - Microsoft Teams - 如何使用 MS Graph 在 Teams 频道中检索有关未读消息的信息
- python - 如何获取 QTreeWidget 可见区域中显示的所有项目?
- django - 如何在 Django views.py 中使用 int: 参数呈现重定向 URL?
- ios - 是否可以在 IO 上使用带有 Kotlin 的外部麦克风?
- javascript - 在 Typescript 中导出和导入模块
- amazon-web-services - 无法读取上传到 AWS S3 的图像
- python - 如何从具有 [0,1) 的随机 () 获得的浮点数以相等的可能性返回 [0, 1000) 的整数范围?
- java - Android-XML 自定义微调器