Несогласованный интервал в точечной диаграмме решетки между значениями y

Я пытаюсь использовать dotplot() из "решетки", чтобы построить набор данных, где категории присутствуют только для подмножества, и я звоню scales = list(y = list(relation = "free")) чтобы избежать ненужного вертикального расстояния. Тем не менее, выполнение этого, кажется, запутывает вертикальное расстояние между предметами. Более того, похоже, что это связано с тем, перекрываются ли категории, или только тогда возникает ошибка.

library(lattice)

variables <- c(rep("Age", 4), rep("Sex", 2), rep("Children", 3))
levels <- c(1, 5, 100, 101, "Females", "Males", 2, 3, 90)
values <- rnorm(9)    

dotplot(levels ~ values | variables, layout = c(1,3),
        scales = list(y = list(relation = "free")))

Imgur

Вы можете ясно видеть, что интервал между, например, 90 и 3 выключен, тогда как с мужчинами и женщинами проблем нет. Теперь, если я изменю категории, которые имеют числовые значения, чтобы они не перекрывались, я получаю правильный интервал.

levels <- c(1:4, "Females", "Males", 5:7)

dotplot(levels ~ values | variables, layout = c(1,3),
        scales = list(y = list(relation = "free")))

Imgur

Кто-нибудь знает, что происходит и что я могу сделать, чтобы это исправить?

1 ответ

Решение

Вы можете использовать функцию автора lattice (см. точечный график, отбрасывая неиспользуемые уровни "у").

Цитируя Дипаян Саркар из этого поста:

"Это немного проблематично. В основном, вы можете использовать relation="free"/"sliced", но у себя ведет себя как as.numeric(y) было бы. Итак, если небольшое подмножество в каждой панели всегда более или менее смежно (с точки зрения уровней, близких друг к другу), то с вами все будет в порядке. В противном случае вы бы не. В этом случае вы все еще можете написать свой собственный prepanel а также panel функции"

dotplot(levels ~ values | variables, layout = c(1,3),
        scales = list(y = list(relation = "free")),
        prepanel = function(x, y, ...) {
          yy <- y[, drop = TRUE]
          list(ylim = levels(yy),
               yat = sort(unique(as.numeric(yy))))
        },
        panel = function(x, y, ...) {
          yy <- y[, drop = TRUE]
          panel.dotplot(x, yy, ...)
        }) 

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