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 масштабирует каждую грань отдельно, чтобы разместить невидимые точки, которые вы добавили. Немного взломан, но работает красиво.