我想使用R studio制作一个类似于下面的绘图(在Arc Map中创建)

enter image description here

我try 了以下代码:

# data processing
library(ggplot2)
# spatial
library(raster)
library(rasterVis)
library(rgdal)

#
test <- raster(paste(datafold,'oregon_masked_tmean_2013_12.tif',sep="")) # read the temperature raster
OR<-readOGR(dsn=ORpath, layer="Oregon_10N") # read the Oregon state boundary shapefile

gplot(test) +  
  geom_tile(aes(fill=factor(value),alpha=0.8)) + 
  geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
               fill=NA,color="grey50", size=1)+
  coord_equal()

该代码的输出如下所示:

enter image description here

有几件事需要注意.首先,R版本中缺少流域形状文件.没关系.

其次,在较深的绘图中,较深的灰色背景没有数据值.在Arc中,它们不显示,但在R中,它们显示gplot.当我使用光栅软件包中的"绘图"时,它们不会显示:

plot(test)

enter image description here

我的问题如下:

  1. 如何在"gplot"示例中去掉深灰色的NoData填充?
  2. 如何将图例( colored颜色 条)设置为合理的(如在ArcMap和光栅"绘图"图例中)
  3. 如何控制 colored颜色 映射?

值得注意的是,我try 了许多不同版本的

scale_fill_brewer
scale_fill_manual
scale_fill_gradient

以此类推,但我会犯错误,例如

br <- seq(minValue(test), maxValue(test), len=8)

gplot(test)+
geom_tile(aes(fill=factor(value),alpha=0.8)) +

scale_fill_gradient(breaks = br,labels=sprintf("%.02f", br)) +

geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
             fill=NA,color="grey50", size=1)+
coord_equal()

Regions defined for each Polygons
Error: Discrete value supplied to continuous scale

最后,一旦我有了绘制其中一个 map 的解决方案,我想在一个图形上绘制多个 map ,并为整个面板创建一个 colored颜色 栏(即,所有 map 都有一个 colored颜色 栏),我想能够控制 colored颜色 栏的位置和大小.下面是一个我可以用grid做的例子.安排,但我不知道如何设置单个 colored颜色 栏:

r1 <- test
r2 <- test
r3 <- test
r4 <- test

colr <- colorRampPalette(rev(brewer.pal(11, 'RdBu')))

l1 <- levelplot(r1, 
          margin=FALSE,                       
          colorkey=list(
             space='bottom',                   
             labels=list(at=-5:5, font=4),
             axis.line=list(col='black')       
          ),    
          par.settings=list(
             axis.line=list(col='transparent') 
          ),
          scales=list(draw=FALSE),            
          col.regions=viridis,                   
          at=seq(-5, 5, len=101)) +           
   layer(sp.polygons(oregon, lwd=3))

l2 <- levelplot(r2, 
                margin=FALSE,                       
                colorkey=list(
                   space='bottom',                   
                   labels=list(at=-5:5, font=4),
                   axis.line=list(col='black')       
                ),    
                par.settings=list(
                   axis.line=list(col='transparent') 
                ),
                scales=list(draw=FALSE),            
                col.regions=viridis,                   
                at=seq(-5, 5, len=101)) +           
   layer(sp.polygons(oregon, lwd=3))

l3 <- levelplot(r3, 
                margin=FALSE,                       
                colorkey=list(
                   space='bottom',                   
                   labels=list(at=-5:5, font=4),
                   axis.line=list(col='black')       
                ),    
                par.settings=list(
                   axis.line=list(col='transparent') 
                ),
                scales=list(draw=FALSE),            
                col.regions=viridis,                   
                at=seq(-5, 5, len=101)) +           
   layer(sp.polygons(oregon, lwd=3))

l4 <- levelplot(r4, 
                margin=FALSE,                       
                colorkey=list(
                   space='bottom',                   
                   labels=list(at=-5:5, font=4),
                   axis.line=list(col='black')       
                ),    
                par.settings=list(
                   axis.line=list(col='transparent') 
                ),
                scales=list(draw=FALSE),            
                col.regions=viridis,                   
                at=seq(-5, 5, len=101)) +           
   layer(sp.polygons(oregon, lwd=3))

grid.arrange(l1, l2, l3, l4,nrow=2,ncol=2) #use package gridExtra   

输出如下:

enter image description here

shapefile和光栅文件可从以下链接获得:

https://drive.google.com/open?id=0B5PPm9lBBGbDTjBjeFNzMHZYWEU

非常感谢提前.

devtools::session_info()

包裹-------------------------------------------------------------------------------------------------------------------------

推荐答案

以下是我将如何做到这一点,用rasterVis::levelplot:

加载内容:

library(rgdal)
library(rasterVis)
library(RColorBrewer)

阅读以下内容:

oregon <- readOGR('.', 'Oregon_10N')
r <- raster('oregon_masked_tmean_2013_12.tif')

定义一个 colored颜色 渐变调色板(或长度为1的 colored颜色 向量,短于下面用at参数定义的 colored颜色 渐变的中断数).

colr <- colorRampPalette(brewer.pal(11, 'RdYlBu'))

情节:

levelplot(r, 
          margin=FALSE,                       # suppress marginal graphics
          colorkey=list(
            space='bottom',                   # plot legend at bottom
            labels=list(at=-5:5, font=4)      # legend ticks and labels 
          ),    
          par.settings=list(
            axis.line=list(col='transparent') # suppress axes and legend outline
          ),
          scales=list(draw=FALSE),            # suppress axis labels
          col.regions=colr,                   # colour ramp
          at=seq(-5, 5, len=101)) +           # colour ramp breaks
  layer(sp.polygons(oregon, lwd=3))           # add oregon SPDF with latticeExtra::layer

enter image description here

实际上,您可能希望绘制图例轮廓(包括其记号),在这种情况下,在colorkey个参数的列表中添加axis.line=list(col='black')个.这需要覆盖由以下原因导致的箱子一般抑制:

levelplot(r, 
          margin=FALSE,                       
          colorkey=list(
            space='bottom',                   
            labels=list(at=-5:5, font=4),
            axis.line=list(col='black')       
          ),    
          par.settings=list(
            axis.line=list(col='transparent') 
          ),
          scales=list(draw=FALSE),            
          col.regions=colr,                   
          at=seq(-5, 5, len=101)) +           
  layer(sp.polygons(oregon, lwd=3))                  

enter image description here

我同意@hrbrmstr的说法,viridis通常是better ramp to use,尽管在我看来有点难看.与ColorBrewer's RdYlBu这样的产品相比,它的主要优点是,当去饱和时, colored颜色 仍然是不同的, colored颜色 差异更好地反映了价值观的差异.不过,我相信RdYlBu完全适用于氘眼/原发性/三发性色盲.

以下是viridis版本:

library(viridis)
levelplot(r, 
          margin=FALSE,                       
          colorkey=list(
            space='bottom',                   
            labels=list(at=-5:5, font=4),
            axis.line=list(col='black')       
          ),    
          par.settings=list(
            axis.line=list(col='transparent') 
          ),
          scales=list(draw=FALSE),            
          col.regions=viridis,                   
          at=seq(-5, 5, len=101)) +           
  layer(sp.polygons(oregon, lwd=3))

enter image description here


EDIT

为了回答OP的附加问题,下面是如何根据要求绘制多个光栅.

假设所有光栅都具有相同的范围、分辨率、投影等,可以将它们堆叠成RasterStack,然后在堆栈上使用levelplot.您可以将width作为列表中的一个元素传递给colorkey,以控制图例的高度("宽度"有点违反直觉,但默认情况下图例是垂直的).如果要抑制每个面板上方的条形标签(正如我在下面所做的那样——默认情况下,它们用堆栈的图层名称进行标记[请参见names(s)]),可以将strip.borderstrip.background添加到传递到par.settings的列表中.

s <- stack(r, r*0.8, r*0.6, r*0.4)
levelplot(s, 
          margin=FALSE,                       
          colorkey=list(
            space='bottom',                   
            labels=list(at=-5:5, font=4),
            axis.line=list(col='black'),
            width=0.75
          ),    
          par.settings=list(
            strip.border=list(col='transparent'),
            strip.background=list(col='transparent'),
            axis.line=list(col='transparent')
          ),
          scales=list(draw=FALSE),            
          col.regions=viridis,                   
          at=seq(-5, 5, len=101),
          names.attr=rep('', nlayers(s))) +           
  layer(sp.polygons(oregon, lwd=3))

enter image description here

R相关问答推荐

从 CI 输出制作表格

在数据框中求和,条件来自另一列

允许不同数量的条件和条件本身的动态“case_when”

反复计算

如何计算每个月和每年的总数?

减少名称与模式匹配的列

如何将字符串向量(每个都给出命令)转换为 R 中的函数?

按其他日期列中的信息填充缺失的变量 (R)

如何显示多个图层的图例(geom_point 和 geom_bar)?

减少标题和表格之间的填充

在R中从宽到长reshape 数据框

如何根据值在矩阵上水平移动行

ggplot 适合图例大小到绘图大小

如何使用“ggplot2”从数字矩阵中绘制栅格

如何将所有列重命名为R中的中间分隔符?

使用 dplyr 随机标记组内的记录

在 R 中拆分包含多个分隔符的字符串

在一长串字符中查找最长的重复单词

无论向量中的关系如何,如何识别每个整数序列

根据 R 中第一个数据集的值向量化来自不同数据集的变量的新变量添加