Как установить 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"))