Некоторые примеры данных:
dfr <- data.frame(
x = rep.int(1:10, 2),
y = runif(20),
g = factor(rep(letters[1:2], each = 10))
)
Простая диаграмма рассеяния с двумя гранями:
p <- ggplot(dfr, aes(x, y)) +
geom_point() +
facet_wrap(~ g, scales = "free_y")
Я могу установить пределы оси для всех панелей с помощью
p + scale_y_continuous(limits = c(0.2, 0.8))
(или оболочка для этого типа ylim
)
но как установить разные пределы оси для разных фасетов?
Решительный способ сделать это - передать список этому аргументу, например,
p + scale_y_continuous(limits = list(c(0.2, 0.8), c(0, 0.5)))
К сожалению, это просто выдает ошибку в случае ggplot2.
EDIT:
Вот частичный взлом. Если вы хотите расширить диапазон масштабов, вы можете добавить столбцы в свой набор данных, указав пределы, а затем нарисуйте их с помощью geom_blank
.
Модифицированный набор данных:
dfr <- data.frame(
x = rep.int(1:10, 2),
y = runif(20),
g = factor(rep(letters[1:2], each = 10)),
ymin = rep(c(-0.6, 0.3), each = 10),
ymax = rep(c(1.8, 0.5), each = 10)
)
Обновлен сюжет:
p + geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax))
Теперь весы разные, а левый правильный. К сожалению, правая шкала не сжимается, поскольку ей нужно освободить место для очков.
В случае, если это поможет, теперь мы можем перефразировать вопрос как «можно ли рисовать точки без пересчета шкал и без явного вызова scale_y_continuous
?»