当 tmap 工作正常时,如何解决 ggplot 中缺少变量的问题?
How do I fix this missing variable problem in ggplot when tmap works fine?
我有一个很大的空间数据框,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
根据 header 中的建议,我有: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) 领土当局的地图,与其他 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
.
的错误或警告
没有数据集的可重现示例,很难确定问题的解决方案,但也许您可以在将数据转换为 sf 对象后使用 ggplot2
绘制数据,然后使用 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))
我得到了和你一样的错误:
Regions defined for each Polygons Error in FUN(X[[i]], ...) : object 'NAME_1' not found
但是当我这样做时:
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"))
它能回答您的问题吗?如果没有,请考虑提供一个可重现的数据集示例
我有一个很大的空间数据框,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
根据 header 中的建议,我有: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) 领土当局的地图,与其他 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
.
没有数据集的可重现示例,很难确定问题的解决方案,但也许您可以在将数据转换为 sf 对象后使用 ggplot2
绘制数据,然后使用 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))
我得到了和你一样的错误:
Regions defined for each Polygons Error in FUN(X[[i]], ...) : object 'NAME_1' not found
但是当我这样做时:
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"))
它能回答您的问题吗?如果没有,请考虑提供一个可重现的数据集示例