我创建了一个名为“温度”的新变量,它代表检测海洋热锋的温度梯度。我在绘制该变量时遇到的一个问题是陆地部分(包括非洲和巴西的一部分(大西洋))出现了逆转。非洲出现在左边,巴西出现在右边,仿佛纬度和经度的符号颠倒了——东热带大西洋的海滨。
最初,地图看起来是颠倒的,但我转置了文件来纠正它,但它仍然是翻转的。我不确定如何调整它以使纬度和经度与其符号正确。非常感谢你的帮助;我很卡住了!
#Set the path fot the NetCDF
ncfile <- "C:/Users/mdolores.riesgo/Desktop/PhD_MB/PhD_Documents/Chapters/01_Chapter/01_RawData/CopernicusDataProducts/Var_Calculated/Fronts/2018/CMEMS_TropicalAtlantic_thetao_Aug2018_front.nc"
#Import the netCDF
nc <- nc_open(ncfile)
print(nc) #details about the product
dimensions <- names(nc$dim)
print(dimensions)
variables <- names(nc$var)
print(variables)
lon <- ncvar_get(nc, "longitude")
lat <- ncvar_get(nc, "latitude")
gradfront <- ncvar_get(nc, "Temperature")
gradfront <- t(gradfront)
grad <- raster(gradfront)
extent(grad) <- c(min(lon), max(lon), min(lat), max(lat))
entent(grad)
#The result
#class : Extent
#xmin : -43.16667
#xmax : 19.33333
#ymin : -26.5
#ymax : 29.41667
plot(grad)
欢迎访问 StackOverflow。
就像一些评论指出的那样,您确实应该在问题中提供更多信息,以便其他人可以“玩弄”您的数据和代码以找到答案。指向您的数据文件的链接会非常有帮助。尽管如此,这个问题还是很明显的,因为这对于任何在 R 中使用过 netCDF 数据的人来说都很常见。
我在 CMEMS 上找不到你的文件,所以我在这里使用另一个文件,但原理是相同的。
根本问题
在 R 中,矩阵和数组中的数据按列优先顺序存储(Fortran 风格)。简而言之,这意味着数据从左上角位置向下,然后按列向右移动。大多数绘图软件,包括
raster
底层的 GDAL 库,都使用行主序(C 风格):行优先,向下移动。绘制数据时,对于 2D matrix
,纠正此问题的简单方法是使用 t()
转置数据。这显然不适合你。其原因如下所示。
使用正确的工具
raster
软件包已被来自同一开发人员的 terra
软件包取代。使用 terra
,因为它比 raster
更容易、更快。
同样,我使用包
ncdfCF
来访问netCDF数据。这是一个新的软件包(我是开发人员),仍在开发中,但它已经比ncdf4
更容易使用。
看数据
> library(ncdfCF)
> src <- "~/20140815120000-ESACCI-L4_GHRSST-SST-GMPE-GLOB_CDR2.0-v02.0-fv01.0.nc"
> ds <- open_ncdf(src)
# The variables in the file
> names(ds)
[1] "field_name" "analysed_sst" "standard_deviation" "analysis_number"
[5] "median_type" "anomaly_fields" "gradient_fields"
# Look at the SST variable
> sst <- ds[["analysed_sst"]]
> sst
Variable: [7] analysed_sst | median SST from GMPE
Dimensions:
id axis name long_name length values
0 X lon 1440 [-179.875 ... 179.875]
1 Y lat 720 [-89.875 ... 89.875]
2 T time reference time of sst field 1 [2014-08-15 12:00:00]
### (Attributes omitted for brevity)
问题现在变得清晰了:
lat
维度从最低值到最高值。这是符合 CF 元数据约定的 netCDF 文件中的常见模式(几乎所有海洋和气候产品都是如此)。按照上面讨论的存储模式,这个文件中的数据是从左下到顶部,然后每列到右边!
在您的文件中,这可能有所不同。鉴于该图是镜像的,人们会假设
lon
值以相反的顺序存储。请检查。下面的解决方案原则上仍然是相同的,但您可能需要更改尺寸才能修改。
解决方案
所以数据是按特定顺序排列的,而
terra
期望的是另一个顺序。这需要几个步骤来纠正。
# Get the data and drop the degenerate time dimension to get a matrix
> sst <- sst[]
> sst <- drop(sst)
# Transpose and then "flip" the data
> sst <- t(sst)
> sst <- sst[nrow(sst):1, ]
# Now you can plot the matrix
> plot(rast(sst))
Q-n-D 解决方案
请注意,如果直接使用
terra
打开 netCDF 文件,则会自动修正纬度坐标和存储顺序(毕竟这是一个已知且常见的问题):
library(terra)
x <- rast(src)
plot(x[[1]]) # Plot the first spatial variable, SST here
但是,由于您正在攻读博士学位,我假设您需要在 R 中处理数据。
terra
并不是一个好的解决方案,因为它不提供对 netCDF 文件中所有详细信息的访问,特别是元数据。与 terra
支持等通用工具相比,海洋 netCDF 文件往往要复杂得多,并且需要解释元数据。如果您需要自己编写任何处理函数,请使用专注于 netCDF 的包。
Mucha suerte con tus investigaciones.