R: Как использовать cop_cartesian на facet_grid со свободной осью
Рассмотрим некоторый график facet_grid
mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point()
mt + facet_grid(vs ~ am, scales = "free")
![plottttt]()
Представьте себе, что я просто хочу увеличить только верхнюю строку на приведенных выше графиках, чтобы показывать только значения y-осей между 3 и 4. Я мог бы сделать это с помощью coord_cartesian()
, если они weren ' t граненый или если я хотел бы увеличить все графики, но не имею хорошего решения в этом случае. Я полагаю, что я мог бы сначала подмножить данные, но это является табу по уважительной причине (например, сбросит какой-либо статистический уровень и т.д.).
(Обратите внимание, что вопрос связан с этим: R: {ggplot2}: Как я могу самостоятельно отрегулировать пределы оси x на графике facet_grid?, но ответ там не будет работать для этой цели.)
Ответы
Ответ 1
Старый пост, но я искал одно и то же и ничего не мог найти - [возможно, это способ Установить ограничения на ось y для двух зависимых переменных, используя facet_grid()
Решение не очень элегантно/эффективно, но я думаю, что он работает - в основном создайте два сюжета с разными координированными вызовами и поменяйте их на grobs.
# library(ggplot2)
# library(gtable)
# Plot
mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point()
# --------------------------------------------------------------------------------
p1 <- mt + facet_grid(vs ~ am, scales = "free") + coord_cartesian(ylim = c(1,6))
g1 <- ggplotGrob(p1)
p2 <- mt + facet_grid(vs ~ am, scales = "free") + coord_cartesian(ylim = c(3,5))
g2 <- ggplotGrob(p2)
# ----------------------------------------------------------
# Replace the upper panels and upper axis of p1 with that of p2
# Tweak panels of second plot - the upper panels
g1[["grobs"]][[6]] <- g2[["grobs"]][[6]]
g1[["grobs"]][[8]] <- g2[["grobs"]][[8]]
#Tweak axis
g1[["grobs"]][[4]] <- g2[["grobs"]][[4]]
grid.newpage()
grid.draw(g1)
Ответ 2
Итак, это старый вопрос, но я хотел поделиться тем, что нашел. Самое простое - добавить искусственные точки к вашим данным, например. в нижнем левом и верхнем правом углу ваших данных для каждого сюжета. Поместите эту информацию в отдельный кадр данных, а затем добавьте его в график с помощью geom_point, используя параметр alpha = 0, чтобы сделать точки невидимыми. Установите масштаб оси в facet_wrap на "free_x" или "free_y", в зависимости от того, что вам нужно.
Теперь ggplot масштабирует каждую грань отдельно, чтобы разместить невидимые точки, которые вы добавили. Немного взломан, но работает красиво.