Пользовательская функция решетки: получение правильных цветов на панелях
Я пытаюсь контролировать цвет точек данных в пользовательской функции решетки. Идея в том, что ответ может быть функцией одного или двух факторов. Окраска точек данных должна определяться fac1
, Вот функция:
compareCats <-
function(formula = NULL, data = NULL, cols = NULL, ...) {
TwoFac <- FALSE
res <- as.character(formula[[2]])
if (length(formula[[3]]) == 1) {
fac1 <- as.character(formula[[3]])
}
if (length(formula[[3]]) == 3) {
fac2 <- as.character(formula[[3]][3])
fac1 <- as.character(formula[[3]][2])
TwoFac <- TRUE
}
args <- as.list(match.call(expand.dots = FALSE)[-1]) # used a bit later
if (TwoFac) keep <- c(res, fac1, fac2) # Reduce the df and clean it of NAs
if (!TwoFac) keep <- c(res, fac1)
data <- data[, keep]
data <- na.omit(data)
# cols2 is used for the data points according to levels in fac1
if (!TwoFac) cols2 <- cols[data[,fac1]] # works fine
if (TwoFac) {
# In this case, the points and panels are drawn in an order I don't understand
cols2 <- rep(NA_character_, nrow(data))
for (i in 1:nlevels(data[,fac1])) { # make the colors correspond to the original order
tmp <- which(data[,fac1] == levels(data[,fac1])[i])
cols2[tmp] <- cols[i]
}
}
data$cols <- cols2
p <- lattice::xyplot(as.formula(args$formula), # now the plot
data = eval(args$data), ...,
panel = function(x, y, ...) {
lattice::panel.xyplot(x, y, col = data$cols, ...)
}
)
return(p)
}
А вот данные и два вызова функций:
set.seed(13)
mydf <- data.frame(
resp = rnorm(40),
cat1 = sample(LETTERS[1:3], 40, replace = TRUE),
cat2 = sample(letters[1:2], 40, replace = TRUE))
library("lattice")
library("plyr")
# One factor / works fine
p <- compareCats(formula = resp~cat1, data = mydf,
cols = c("red", "orange", "blue"))
print(p)
# Two factors / colors not assigned correctly
p <- compareCats(formula = resp~cat1 | cat2, data = mydf,
cols = c("red", "orange", "blue"))
print(p)
Первый производит эту диаграмму:а второй этот:Как мне получить цвета во втором примере: красный, оранжевый, синий, красный, оранжевый, синий, слева направо? Я пробовал множество подходов и могу заставить первую панель вести себя иногда, но вторая панель кажется случайной. Очевидно, я не совсем понимаю, какой порядок использует Решетка в двухфакторном случае, документы предполагают, что взаимодействие используется, но это все еще оставляет несколько возможностей, ни одну из которых я не смог выяснить.
1 ответ
Если вы хотите последовательно менять цвета точек на панелях, я предлагаю вам сделать это с помощью более стандартного groups=
аргумент. Я бы изменил эти две строки в вашей функции compareCats
cols2 <- factor(cols2, levels=cols) # no need to attach to data
p <- lattice::xyplot(as.formula(args$formula), groups=cols2,
data = eval(args$data), ...,
par.settings=list(superpose.symbol=list(col=cols))
)
Здесь мы используем groups=
чтобы назначить точки для разных групп, и мы используем superpose.symbol, чтобы указать, какой цвет назначать каждой группе.