изменить фон и текст полос, связанных с несколькими панелями в R / решетке - PullRequest
13 голосов
/ 16 декабря 2011

Ниже приведен пример, над которым я работаю.

require(lattice)
data(barley)
xyplot(yield ~ year | site, data = barley)

enter image description here

Я хочу поставить разные цвета полосок для разных полосок, а цвет шрифта также отличается оптимизированным цветом фона. Например:

strip background colors = c("black", "green4", "blue", "red", "purple", "yellow")
font color = c("white", "yellow", "white", "white", "green", "red")

Грубый эскиз первого предоставляется: enter image description here Как мне этого добиться?

Ответы [ 2 ]

16 голосов
/ 16 декабря 2011

Вот чистое и легко настраиваемое решение.

myStripStyle(), функция, которая передается в аргумент strip= xyplot(), использует переменную счетчика which.panel для выбора цветов, а такжезначение factor.levels для панели, которая в данный момент строится.

Если вы хотите поиграть с настройками, просто поместите browser() где-нибудь внутри определения myStripStyle() и получите его!

bgColors <- c("black", "green4", "blue", "red", "purple", "yellow")
txtColors <- c("white", "yellow", "white", "white", "green", "red")

# Create a function to be passed to "strip=" argument of xyplot
myStripStyle <- function(which.panel, factor.levels, ...) {
    panel.rect(0, 0, 1, 1,
               col = bgColors[which.panel],
               border = 1)
    panel.text(x = 0.5, y = 0.5,
               font=2,
               lab = factor.levels[which.panel],
               col = txtColors[which.panel])
}    
xyplot(yield ~ year | site, data = barley, strip=myStripStyle)

enter image description here

10 голосов
/ 22 февраля 2012

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

Вы можете использовать par.strip.text для передачи дополнительных аргументов функции strip.par.strip.text может быть определено на уровне графика и обычно используется для настройки свойств отображения текста, но, используя список, вы можете использовать его для переноса ваших переменных в функцию полосы.

bgColors <- c("black", "green4", "blue", "red", "purple", "yellow")
txtColors <- c("white", "yellow", "white", "white", "green", "red")

# Create a function to be passes to "strip=" argument of xyplot
myStripStyle <- function(which.panel, factor.levels, par.strip.text,
                     custBgCol=par.strip.text$custBgCol,
                     custTxtCol=par.strip.text$custTxtCol,...)     {
    panel.rect(0, 0, 1, 1,
            col = custBgCol[which.panel],
            border = 1)
    panel.text(x = 0.5, y = 0.5,
            font=2,
            lab = factor.levels[which.panel],
            col = custTxtCol[which.panel])
}
xyplot(yield ~ year | site, data = barley,
        par.strip.text=list(custBgCol=bgColors,
                            custTxtCol=txtColors),
        strip=myStripStyle)
...