Как установить ggplot2 для отображения растра

Я хотел бы сделать сюжет, используя студию R, похожую на ту, что приведена ниже (созданная в Arc Map)

введите описание изображения здесь

Я пробовал следующий код:

# 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()

Результат этого кода выглядит следующим образом:

введите описание изображения здесь

Несколько замечаний. Во-первых, в версии R отсутствуют файлы формы водораздела. это нормально.

Во-вторых, более темный серый фон на графике R имеет значение "Нет данных". В Arc они не отображаются, но в R они отображаются с помощью gplot. Они не отображаются, когда я использую "plot" из растрового пакета:

plot(test)

введите описание изображения здесь

Мои вопросы таковы:

  • Как избавиться от темно-серого NoData заполнить пример "gplot"?
  • Как настроить легенду (colorbar) как разумную (например, в легендах ArcMap и растровых графиках?)
  • Как управлять цветом?

Чтобы отметить, я пробовал много разных версий

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

Наконец, когда у меня есть решение для построения одной из этих карт, я хотел бы построить несколько карт на одной фигуре и создать единую панель цветов для всей панели (т.е. одну цветную панель для всех карт), и я хотел бы быть в состоянии контролировать, где находится цветная панель, и размер цветной панели. Вот пример того, что я могу сделать с grid.arrange, но я не могу понять, как установить один цветной бар:

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   

Вывод:

введите описание изображения здесь

Файл формы и растровый файл доступны по следующей ссылке:

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

Большое спасибо загодя.

DevTools:: session_info() Информация о сеансе ------------------------------------------------ -------------------------------------------------- -------------------  значение настройки
 версия R версии 3.1.1 (2014-07-10)  система x86_64, darwin10.8.0
 ui RStudio (0.98.1103)
 язык (EN)
 сопоставить en_US.UTF-8
 tz America/Los_Angeles

Пакеты ---------------------------------------------- -------------------------------------------------- -------------------------  пакет * версия источник даты
 bitops 1.0-6 2013-08-17 CRAN (R 3.1.0)  colorspace 1.2-6 2015-03-11 CRAN (R 3.1.3)  devtools 1.8.0 2015-05-09 CRAN (R 3.1.3)  дайджест 0.6.4 2013-12-03 CRAN (R 3.1.0)  ggplot2 * 1.0.1 2015-03-17 CRAN (R 3.1.3)  ggthemes * 2.1.2 2015-03-02 CRAN (R 3.1.3)  git2r 0.10.1 2015-05-07 CRAN (R 3.1.3)  gridExtra 0.9.1 2012-08-09 CRAN (R 3.1.0)  gtable 0.1.2 2012-12-05 CRAN (R 3.1.0)  гексбин * 1.26.3 2013-12-10 CRAN (R 3.1.0)  решетка * 0.20-29 2014-04-04 CRAN (R 3.1.1)  решеткаExtra * 0.6-26 2013-08-15 CRAN (R 3.1.0)  magrittr 1.5 2014-11-22 CRAN (R 3.1.2)  МАССА 7.3-33 2014-05-05 КРАН (R 3.1.1)  memoise 0.2.1 2014-04-22 CRAN (R 3.1.0)  munsell 0.4.2 2013-07-11 CRAN (R 3.1.0)  plyr 1.8.2 2015-04-21 CRAN (R 3.1.3)  proto 0.3-10 2012-12-22 CRAN (R 3.1.0)  растра * 2.2-31 2014-03-07 CRAN (R 3.1.0)  rasterVis * 0.28 2014-03-25 CRAN (R 3.1.0)  RColorBrewer * 1.0-5 2011-06-17 CRAN (R 3.1.0)  Rcpp 0.11.2 2014-06-08 CRAN (R 3.1.0)  RCURL 1,95-4,6 2015-04-24 CRAN (R 3.1.3)  reshape2 1.4.1 2014-12-06 CRAN (R 3.1.2)  rgdal * 0.8-16 2014-02-07 CRAN (R 3.1.0)  rversions 1.0.0 2015-04-22 CRAN (R 3.1.3)  шкалы * 0.2.4 2014-04-22 CRAN (R 3.1.0)  sp * 1.0-15 2014-04-09 CRAN (R 3.1.0)  stringi 0.4-1 2014-12-14 CRAN (R 3.1.2)  stringr 1.0.0 2015-04-30 CRAN (R 3.1.3)  viridis * 0.3.1 2015-10-11 CRAN (R 3.2.0)  XML 3.98-1.1 2013-06-20 CRAN (R 3.1.0)  зоопарк 1.7-11 2014-02-27 CRAN (R 3.1.0)

Ответы

Ответ 1

Вот как бы я это сделал, с rasterVis::levelplot:

Загрузка вещей:

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

Прочитайте вещи:

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

Определите палитру цветового рампы (или вектор цветов с длиной 1 короче, чем количество разрывов для цветовой рампы, определенной с помощью аргумента at ниже).

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

введите описание изображения здесь

Возможно, вам понадобится набросок легенды (включая его тики), в этом случае добавьте axis.line=list(col='black') в список аргументов colorkey. Это необходимо, чтобы переопределить общее подавление ящиков, вызванное par.settings=list(axis.line=list(col='transparent')):

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))                  

введите описание изображения здесь

Я согласен с @hrbrmstr, что viridis часто является лучшим рампом для использования, несмотря на то, что, по-моему, немного уродлив. Основные преимущества над чем-то вроде ColorBrewer RdYlBu заключаются в том, что цвета по-прежнему различаются при ненасыщенности, а цветовые различия лучше отражают различия в значениях. Я считаю, что RdYlBu отлично доступен для слепоты Deuteranopia/Protanopia/Tritanopia.

Здесь версия 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))

введите описание изображения здесь


ИЗМЕНИТЬ

В ответ на дополнительный вопрос OP, вот как построить несколько растров по запросу.

Предполагая, что все растры имеют одинаковую степень, разрешение, проекции и т.д., вы можете складывать их в RasterStack, а затем использовать levelplot в стеке. Вы можете передать width в качестве элемента списка, переданного в colorkey, для управления высотой легенды ( "ширина" немного контр-интуитивно понятна, но по умолчанию легенды вертикальны). Если вы хотите подавить метки стенок над каждой панелью (как я сделал ниже - по умолчанию они помечены именами стекового слоя [см. names(s)]), вы можете добавить strip.border и strip.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))

введите описание изображения здесь

Ответ 2

library(ggplot2)
library(raster)
library(rasterVis)
library(rgdal)
library(grid)
library(scales)
library(viridis)  # better colors for everyone
library(ggthemes) # theme_map()

datafold <- "/path/to/oregon_masked_tmean_2013_12.tif"
ORpath <- "/path/to/Oregon_10N.shp"

test <- raster(datafold) 
OR <- readOGR(dsn=ORpath, layer="Oregon_10N") 

Вы не включили все, что вы использовали, чтобы сделать test, поэтому я сделал это:

test_spdf <- as(test, "SpatialPixelsDataFrame")
test_df <- as.data.frame(test_spdf)
colnames(test_df) <- c("value", "x", "y")

И тогда это просто вопрос отправки этого + шейп файла в ggplot2:

ggplot() +  
  geom_tile(data=test_df, aes(x=x, y=y, fill=value), alpha=0.8) + 
  geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
               fill=NA, color="grey50", size=0.25) +
  scale_fill_viridis() +
  coord_equal() +
  theme_map() +
  theme(legend.position="bottom") +
  theme(legend.key.width=unit(2, "cm"))

введите описание изображения здесь

Теперь он будет работать с любой непрерывной температурной шкалой, т. Виридис - один из лучших, которые можно встретить очень долго.

Вы можете использовать следующее, если вам нужно использовать gplot:

gplot(test) +  
  geom_tile(aes(x=x, y=y, fill=value), alpha=0.8) + 
  geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
               fill=NA, color="grey50", size=0.25) +
  scale_fill_viridis(na.value="white") +
  coord_equal() +
  theme_map() +
  theme(legend.position="bottom") +
  theme(legend.key.width=unit(2, "cm"))