2016-04-06 4 views
2

Используя приведенные ниже данные, как я могу генерировать графики растров и пространственных точек с тем же colorkey, что и в приведенном ниже «соединенном вручную» графике?Одиночный colorkey для растра и точек Levelplot R

library(rasterVis) 
library(raster) 
library(colorRamps) 
col=colorRampPalette(matlab.like2(255)) 

s <- stack(replicate(2, raster(matrix(runif(100), 10)))) 
xy <- data.frame(coordinates(sampleRandom(s, 10, sp=TRUE)), 
       z1=runif(10), z2=runif(10)) 

levelplot(s, margin=FALSE, at=seq(0, 1, 0.05),col.regions=col) 
x=xy$x;y=xy$y;z=xy$z1 

levelplot(z ~ x + y,contour=F, panel = panel.levelplot.points, 
      margin=FALSE,col.regions=col, 
      par.settings=list(axis.line=list(lwd=3), strip.border=list(lwd=3)), 
     cex=1.4, scales=list(x=list(cex=1.7),y=list(cex=1.7)),xlab=list(label="Longitude",cex=2), 
      ylab=list(label="Latitude",cex=2)) 

sample plot

Благодаря @fdestch я был в состоянии произвести следующий участок с помощью:

latticeCombineGrid(mget(rep("pp", 24)), layout = c(3, 8)) 

следующего моих комментариев на печать несколько участков с одной и тем же цветовым ключом.

Проблема, которая должна быть уточнена:

1) Как можно принять решение о порядке панелей? То есть, какая строка & столбца, чтобы разместить конкретный участок, как в levelplot, используя index.cond.

enter image description here

+0

Пожалуйста, внесите другой вопрос по этому вопросу. –

ответ

2

Прежде всего, вы, вероятно, следует убедиться, что перерывы в графике точек идентичны тем, которые определены в первом levelplot.

## raster plot with colorkey disabled 
pr <- levelplot(s, margin = FALSE, at = seq(0, 1, 0.05), col.regions = col, 
       colorkey = FALSE, xlab = list("Longitude", col = "transparent")) 

## points plot 
pp <- levelplot(z ~ x + y, panel = panel.levelplot.points, cex = 1.4, 
       contour = FALSE, margin = FALSE, col.regions = col, 
       colorkey = list(at = seq(0, 1, .05), width = .6, height = .6), 
       xlab = "Longitude", ylab = "Latitude") 

Пожалуйста, обратите внимание на определение прозрачного xlab при создании растрового участка. Это небольшое решение очень полезно при использовании downViewport, чтобы убедиться, что фактические границы участка pr и pp перекрываются (не стесняйтесь запускать grid.rect() сразу после print(pr, newpage = FALSE), чтобы посмотреть, что я имею в виду).

Фактическое расположение участка может быть легко достигнуто с помощью видовых экранов из сетки .

library(grid) 
library(lattice) 

## initialize new grid device 
grid.newpage() 

## add raster plot 
vp1 <- viewport(x = 0, y = 0, width = .5, height = 1, 
       just = c("left", "bottom")) 

pushViewport(vp1) 
print(pr, newpage = FALSE) 

## add points plot 
downViewport(trellis.vpname("page")) 

vp2 <- viewport(x = 1, y = 0, width = .75, height = 1, 
       just = c("left", "bottom")) 
pushViewport(vp2) 
print(pp, newpage = FALSE) 

arranged_plots

+0

очень хорошее решение. Большое спасибо. Что делать, если у меня есть 8 строк и 3 столбца для отображения с одним colorkey? Обычно я использую 'layout = c (3, 8), index.cond = list (c (1,2, ....))' для получения моей сетки. 'Viewport' может быть сложным для организации сюжетов. Любая работа для 'layout' и' index.cond'? – code123

+0

Для этой цели в нашем ** пакете ** Rsenal ** есть функция, называемая ['latticeCombineGrid'] (https://github.com/environmentalinformatics-marburg/Rsenal/blob/master/R/latticeCombineGrid.R). Просто установите пакет через 'devtools :: install_github (« environmentinformatics-marburg/Rsenal »)' и запустите, например. 'решеткаCombineGrid (mget (rep (" pp ", 24)), layout = c (3, 8))'. Обратите внимание, что результаты выглядят лучше всего, когда все графики имеют одинаковые пределы x и y. – fdetsch

+0

ты спас мой день. 'latticeCombineGrid' выглядит очень многообещающим. Я обязательно попробую. Еще раз спасибо. – code123

1

Вот мое решение, использующее latticeExtra::c.trellis:

library(raster) 
library(rasterVis) 

s <- stack(replicate(2, raster(matrix(runif(100), 10)))) 
xy <- data.frame(coordinates(sampleRandom(s, 10, sp=TRUE)), 
       z1=runif(10), z2=runif(10)) 

## Define theme and breaks 
myTheme <- BTCTheme() 
my.at <- seq(0, 1, 0.05) 
  • Заговор Raster* объект, используя rasterVis::levelplot:

    p1 <- levelplot(s, margin=FALSE, 
            at = my.at, 
            par.settings = myTheme) 
    
  • земля точки, используя lattice::levelplot:

    p2 <- levelplot(z1 ~ x + y, data = xy, 
            at = my.at, 
            panel = panel.levelplot.points, 
            par.settings = myTheme) 
    
  • Регистрация их с latticeExtra::c.trellis:

    p3 <- c(p1, p2, layout = c(3, 1)) 
    
  • К сожалению, c.trellis не назначать стрип этикетки правильно, так что вы должны определить их непосредственно:

    update(p3, 
        strip = strip.custom(factor.levels = c(names(s), "Points"))) 
    

raster + points

+0

это еще проще и просто реализовать. Благодарю. Последняя строка кода может использоваться, чтобы определить, где каждый график помещается в панель. Если я знаю имена 's', то я могу легко определить порядок их отображения. – code123

Смежные вопросы