2016-06-16 5 views
1

Можно ли добавить ключ для, например, слоя sp.points, в colorkey, сгенерированный levelplot?Добавить ключ sp.points к levelplot colorkey

Рассмотрим следующий пример:

library(rasterVis) 
library(latticeExtra) 
library(sp) 

r <- as.factor(raster(matrix(rbinom(100, 1, 0.5), 10))) 
levels(r)[[1]] <- data.frame(ID=0:1, z=c('a', 'b')) 
p <- SpatialPoints(matrix(runif(20), 10)) 

levelplot(r, margin=list(draw=FALSE), scales=list(draw=FALSE), 
      col.regions=c('white', 'gray90')) + 
    latticeExtra::layer(sp.points(p, pch=20, col=1)) 

enter image description here

Я хотел бы добавить ввод ключа для точек, ниже существующей цветовой ключ.

запутано решение добавить ключ к levelplot вызова следующим образом, регулируя значения x и y, пока это не в нужном месте, но (1) найти правильный x и y значения является боль, требующая взаимодействия, (2) правое заполнение не изменяет размер для размещения ключа, и (3) размер шрифта автоматически не масштабируется, чтобы соответствовать colorkey.

k <- list(x = 1.02, y = 0.4, corner = c(0, 0), points=list(pch=20, col=1), 
      text=list('foo', cex=0.9)) 

levelplot(r, margin=list(draw=FALSE), scales=list(draw=FALSE), 
      col.regions=c('white', 'gray90'), key=k) + 
    latticeExtra::layer(sp.points(p, pch=20, col=1)) 

enter image description here

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

ответ

1

Хотя это не решает все вопросы, поднятые вы, возможно, функция latticeExtra::mergedTrellisLegendGrob полезна для Вас:

p1 <- levelplot(r, scales=list(draw=FALSE), 
       col.regions=c('white', 'gray90')) 

myPoints <- SpatialPoints(matrix(runif(20), 10)) 
p2 <- spplot(myPoints, pch=20) 

## Merge graphics 
p <- p1 + p2 

## Merge legends 
l1 <- p1$legend$right 
l2 <- p2$legend$bottom 
ll <- mergedTrellisLegendGrob(l1, l2) 
p$legend$right$fun <- ll 

p 

mergedLegends

+0

Спасибо Оскар. Возможно ли, чтобы легенда 'p2' соответствовала клавише levelplot (то есть выше или ниже этого, а не рядом с ним)? – jbaums

+1

Вы должны попробовать аргумент 'vertical' в' mergedTrellisLegendGrob'. Его значением по умолчанию является 'FALSE' (как в этом примере). Изучая его код, я обнаружил, что с 'vertical = TRUE' эта функция использует' packGrob', чтобы перенести первую легенду сверху, а вторую - внизу. Возможно, это не совсем то, что вам нужно. Вместо этого вы можете повторно использовать последние строки этой функции, используя аргументы 'row' и' col' 'packGrob'. –

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

  • Нет связанных вопросов^_^