R - Как добавить заголовок легенды к сюжету уровня, сохраненному в переменной?

Я хотел бы добавить заголовок легенды в график уровня, сохраненный в переменной.

Например, этот код работает:

library(lattice)
library(grid)
x = 1:10
y = rep(x,rep(10,10))
x = rep(x,rep(10))
z = x+y  
levelplot(z~x*y, colorkey=list(labels=list(cex=1,font=2,col="brown"),height=1,width=1.4),main=list('b',side=1,line=0.5))
trellis.focus("legend", side="right", clipp.off=TRUE, highlight=FALSE)
grid.text(expression(m^3/m^3), 0.2, 0, hjust=0.5, vjust=1)
trellis.unfocus()

Но этот код, где тот же график сохраняется как переменная, НЕ работает:

p1 <- levelplot(z~x*y, colorkey=list(labels=list(cex=1,font=2,col="brown"),height=1,width=1.4),main=list('b',side=1,line=0.5))
trellis.focus("legend", side="right", clipp.off=TRUE, highlight=FALSE)
grid.text(expression(m^3/m^3), 0.2, 0, hjust=0.5, vjust=1)
trellis.unfocus()

Как мне этого добиться?

1 ответ

Решение

Это не отвечает на ваш вопрос напрямую, но, возможно, предлагает изменение в рабочем процессе, где вы можете добавить заголовок к ключу, используя аргументы colorkey.

Это включает в себя настройку draw.colorkey функция.

Самый простой способ - это использовать fixInNamespace в интерактивном режиме

fixInNamespace("draw.colorkey", "lattice")

в конце функции измените последние несколько строк на

    }
    if (!is.null(key$title)) {
        key.gf <- placeGrob(key.gf, textGrob(key$title, hjust = key$hjust, 
            vjust = key$vjust, gp = key$gp), row = key$row, col = key$column)
    }
    if (draw) 
        grid.draw(key.gf)
    key.gf
}

Сохраните и закройте, и вы можете использовать, как показано ниже.


Тем не менее, вы не сможете сделать это в интерактивном режиме, поэтому это также может быть сделано как

library(lattice)
library(grid)

# Amend key function
# Hopefully a nicer way to do this!
mykey <- draw.colorkey

body(mykey)[28:30] <- list(
quote(
  if(!is.null(key$title)){
      key.gf <- placeGrob(key.gf,
                      textGrob(key$title,hjust=key$hjust, vjust=key$vjust, gp=key$gp),
                          row=key$row, col=key$column)
  }),
body(mykey)[[28]], 
body(mykey)[[29]])

# Assign to namespace: http://stackru.com/questions/6254744/override-a-function-that-is-imported-in-a-namespace
unlockBinding("draw.colorkey", as.environment("package:lattice"))
assign("draw.colorkey", mykey, "package:lattice")
unlockBinding("draw.colorkey", getNamespace("lattice"))
assign("draw.colorkey", mykey, getNamespace("lattice"))

Затем вы можете передать ключевой заголовок, указав позицию

# Draw plot
x = 1:10
y = rep(x,rep(10,10))
x = rep(x,rep(10))
z = x+y 
p <- levelplot(z~x*y, 
              colorkey=list(labels=list(cex=1, font=2, col="brown"),
                            height=1, width=1.4,
                            title=expression(m^3/m^3), row=3, column=1, vjust=2),
               main=list('b',side=1,line=0.5))


p

Который производит

Другие вопросы по тегам