首页 > 解决方案 > st_contour - 应该使用 aes 创建映射

问题描述

我知道“应该使用 aes 创建映射”位已经完成,所以我希望这是一个足够不寻常的案例,因为我试图找出它发生的原因并提出不足。

根据这个线程stars,我可以使用ggplot. 我正在尝试将相同的对象绘制为轮廓。有问题的数据文件是All_Rasters_Scaled.ascggmapgeom_stars

library(stars)
lemons.ras <- read_stars("All_Rasters_Scales.asd")) %>%
  st_set_crs(2958) %>%
  st_transform(4326)
ggplot() +
geom_stars(data = lemons.ras)

工作正常。Edzer 告诉我st_contour返回一个sf带有轮廓的对象,你必须将它传递geom_sf. 所以:

mycontour <- st_contour(x = lemons.ras, contour_lines = FALSE, breaks = c(0.5, 0.95))
ggmap(myMap) + geom_sf(mycontour)

错误:mapping必须由aes()

我的印象是,在使用对象时不应该看到这个错误sf,实际上这在某种程度上是sf生态系统的重点,因为geometry存在该列。该对象可能以某种方式被错误地创建并且具有所有 NA:

st_bbox(mycontour)

xmin ymin xmax ymax

呐呐呐呐呐

但是,如果我在没有指定任何参数的情况下创建它:

mycontour <- st_contour(x = lemons.ras)

bbox 输出是一样的。对象中的轮廓最小值/最大值也奇怪地重叠。无论我创建的方式如何mycontour,我都会遇到同样的aes错误。尝试指定 aes:

geom_sf(mycontour, mapping = aes())

坐标系已经存在。添加新的坐标系,它将替换现有的坐标系。FUN(X[[i]], ...) 中的错误:找不到对象“lon”

或者

geom_sf(mycontour, mapping = aes(geometry))

警告:忽略未知的美学:x 坐标系已经存在。添加新的坐标系,它将替换现有的坐标系。FUN(X[[i]], ...) 中的错误:找不到对象“纬度”

基本上看起来ggmap/ggplot框架不理解mycontour, 创建者geom_contour是一个sf对象,并且它的aes映射是geometry列。

任何建议都非常感谢。我不确定是否存在geom_contour无法正确创建对象的潜在问题,因此所有值都是NA,并且我不知道如何从对象中提取geometry数据。sf

mymap对象的代码ggmap是:

myLocation <- st_bbox(lemons.ras) %>% as.vector()
myMap <- get_map(location = myLocation)

但是sf对象通常可以在空白处正常工作ggplot()+

提前致谢!

编辑:添加更多细节:

class(mycontour)

“sf” “data.frame”

mycontour$geometry[1]

为 1 个特征设置的几何图形

几何类型:MULTIPOLYGON

尺寸:XY

边界框: xmin: NA ymin: NA xmax: NA ymax: NA

大地 CRS:WGS 84

多多边形((((NA NA,NA NA,NA NA,NA NA,NA ...

更多编辑:

ggplot() +
geom_stars(lemons.ras)

工作正常,创建:

栅格数据

st_bbox(lemons.ras)

xmin ymin xmax ymax

-79.28970 25.68331 -79.21143 25.78939

即看起来也不错。

summary(lemons.ras)
                   Length Class  Mode   

All_Rasters_Scaled.asc 36270 -none- numeric

包括或不包括在内不x=应该st_contour()(并且,经过测试,不会)有所作为。我知道这是不必要的,但我喜欢这样做有两个原因:

  1. 明确表达很少会受到伤害,尤其是在共享代码和教他人时。

  2. 使用 RStudio 的代码完成宏,您可以在函数中点击选项卡,它会为您提供可供选择的参数列表。我尝试按顺序使用它们。此外,如果您明确使用x(或任何默认的第一个参数),那么宏将停止为您提供该参数选项。虽然所有次要语义:)

lemons.ras$All_Rasters_Scaled.asc是一个矩阵数组,大小为 155x234,值范围从 0 到 1(它已被缩放,因此得名)。所以从概念上讲,mycontourfrom中的任何值都不st_contour应该是NA.

st_contour的参数na.rm是默认的,因此我觉得无论如何TRUE都应该删除这些s。NA

我越来越觉得有问题st_contour...

根据getGDALVersionInfo()有“GDAL 3.2.2,于 2021/03/05 发布”

@lovelery 的测试代码:

tif = system.file("tif/L7_ETMs.tif", package = "stars")
x = read_stars(tif)[, 1:50, 1:50, 1:2]
x[[1]] = round(x[[1]]/5)
l = st_contour(x, contour_lines = TRUE, breaks = 11:15)
plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8)

工作正常:

示例代码

l使用它创建st_contour(x, contour_lines = TRUE, ...)多线串特征而不是多面特征。如果我对 执行相同操作lemons.ras,则结果mycontour具有所有 NA 值,这可能与问题有关。l

l

mycontour

我的轮廓

创建它们的文件是st_contour: x:

X

lemons.ras(注意这里值,从 0 到 1):

柠檬.ras

差异:

编辑:如果我从 , 中删除1:2x = read_stars效果plot(l)相同。但是:x 现在是类型:列表 [50 x 50 x 6]。之前是 [50 x 50 x 2]。好的,这是因为输入文件 ,L7_ETMs.tif是 [349 x 352 x 6] 并且索引将其read_stars(tif)[, 1:50, 1:50, 1:2]限制为 2 个波段。

st_dimensions(x)给出:

x 暗淡

st_dimensions(lemons.ras)给出:

柠檬.ras 暗淡

所以这可能是问题的根源。即使lemons.rasplot已作为栅格导入并读入stars,但它似乎缺少band属性,老实说,这些属性看起来并没有添加太多东西,但也许st_contour代码期望它们存在并且没有他们。

实际上看 st_dimensions 的直接输出可能更有启发性:对于 x:

x 更暗

对于柠檬.ras:

莱姆变暗了

相比xlemons.rasNA offsetdeltapointxNULL values,所以我猜x/y几何数据x在 中band,而对于lemons.ras它在values 中。LAWD 栅格数据令人困惑。

再次阅读星星介绍,看起来拆分和合并属性band首先需要存在。所以这个问题看起来越来越多地是由于lemons.ras输入栅格没有band维度。

该文件是使用以下内容创建的:

writeRaster(x, name, format = "ascii", datatype = "FLT4S", bylayer = T)

我不知道选择是否ascii意味着没有乐队信息?我对此表示怀疑?在代码前面创建原始栅格后,它具有以下属性:

类:光栅层

尺寸:3270、3245、10611150(nrow、ncol、ncell)

分辨率:50, 50 (x, y)

范围:594830.7、757080.7、2763971、2927471(xmin、xmax、ymin、ymax)

crs : +proj=utm +zone=17 +datum=WGS84 +units=m +no_defs

来源:记忆

名称:层

值:1、1(最小值、最大值)

在创建此文件期间,看起来band或未layer使用参数。这必然是一个单层/波段栅格,显然输出足够成功,可以在遇到这个问题之前经历多轮处理、编辑、连接、应用等。在创建栅格后使用setValues. 上面有“名称:层”条目。

今天早上的中间结论:

我的输入栅格没有波段属性,只是一个普通/平面栅格,这对于简单的绘图来说很好,但显然不是星星所期望的丰富格式。然而,stars 将使用此文件并将其转换为(弱)stars 对象,但随后它将在 st_contour 中失败,可能是由于缺少乐队。

标签: rggplot2contouraestheticsr-stars

解决方案


推荐阅读