我正在尝试使用ggplot2
绘制空间栅格。
require(raster)
require(ggplot2)
下载数据,使用raster
包加载为栅格。有关此数据产品的更多详细信息,请参见here。然后将栅格转换为点,以便与ggplot
一起使用。
system('wget https://www.dropbox.com/s/7jsdqgc9wjcdznv/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt')
layer<- raster("path/to/raster/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt") #you need to specify your own path here, wherever the downloaded file is saved.
raster.points <- rasterToPoints(layer)
raster.points <- data.frame(raster.points)
colnames(raster.points) <-c('x','y','layer')
现在使用ggplot2
制作地图,然后躺在栅格上。
mp <- NULL
#grab US map and choose colors
map.US <- borders("usa", colour='white',fill='black', lwd=0.4)
mp <- ggplot(data=raster.points, aes(y=y, x=x))
mp <- mp + map.US
mp <- mp + geom_raster(aes(fill=layer))
mp <- mp + theme(axis.text.y=element_blank(),
axis.text.x=element_blank(),
axis.title.y=element_blank(),
axis.title.x=element_blank(),
axis.ticks=element_blank(),
panel.background = element_rect(fill='black'),
plot.background = element_rect(fill='black'),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank())
mp
输出如下:
正如您所看到的,几乎排队,但并不完全。一切都略微向右移动。可能导致此问题的原因以及如何解决?
答案 0 :(得分:4)
遵循ORNL文档,Ndep图的边界实际上与网格的左下角对齐。要获得与中间点对齐的x和y位置(默认为ggplot
),您需要将x位置移动1个网格间隔。因为在这种情况下网格间隔是0.5度,我从我的x坐标向量中减去了半度。
@ 42在评论中提出了这个问题的解决方案。
所以,和以前一样,下载数据:
system('wget https://www.dropbox.com/s/7jsdqgc9wjcdznv/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt')
layer<- raster("path/to/raster/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt") #you need to specify your own path here, wherever the downloaded file is saved.
raster.points <- rasterToPoints(layer)
raster.points <- data.frame(raster.points)
colnames(raster.points) <-c('x','y','layer')
至关重要的是,从坐标的x向量减去半度。
raster.points$x <- raster.points$x - 0.5
现在,继续并绘制:
mp <- NULL
#grab US map and choose colors
map.US <- borders("usa", colour='white',fill='black', lwd=0.4)
mp <- ggplot(data=raster.points, aes(y=y, x=x))
mp <- mp + map.US
mp <- mp + geom_raster(aes(fill=layer))
mp <- mp + theme(axis.text.y=element_blank(),
axis.text.x=element_blank(),
axis.title.y=element_blank(),
axis.title.x=element_blank(),
axis.ticks=element_blank(),
panel.background = element_rect(fill='black'),
plot.background = element_rect(fill='black'),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank())
mp
全部排好了!
答案 1 :(得分:2)
根据42和colin的说法,ORNL提供的文件不正确。你应该告诉他们这件事。该文件包含:
xllcorner -124
yllcorner 25
显然应该是:
xllcorner -124.5
yllcorner 25
如果是,则表示该文件当前将x坐标指定为单元格边,将y坐标指定为单元格中心。任何标准都不好。有些格式可以让x和y都代表单元格边缘而不是单元格中心,但不是两者之一;无论哪种方式,在使用的文件格式(arc-ascii)中都不允许这样做。
纠正此错误的一种好方法是在创建shift
后使用RasterLayer
:
layer < raster("NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt")
layer <- shift(layer, -0.5, 0)
然后继续。这是一种更通用的解决方案,因为它允许将栅格数据正确用于ggplotting之外的其他目的。