Установка индивидуальных ограничений по оси Y с фасетной оберткой НЕ с масштабами free_y
У меня есть эти данные
library(ggplot2)
dat = data.frame(x = c(1,2,1,2),
group = c("a","a","b","b"),
y = c(10,20,1000,2000))
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line() +
facet_wrap(~group, ncol = 1) +
coord_cartesian(ylim = c(0, 30))
Вы можете видеть, что группа B не появляется, потому что я установил предел y 0,30
, Я хочу вручную установить индивидуальные пределы y для каждого графика. Я НЕ хочу использовать scales = "free_y"
потому что мне нужно контролировать пределы в каждом графике.
Есть ли способ сделать это? Можете ли вы как-то указать пределы y для каждого графика в фасетной упаковке?
1 ответ
Если вы не хотите уменьшить свою область построения (то есть не наносить некоторые точки), вы все равно можете иметь "полный" контроль над вашими пределами y при использовании scales = "free_y"
,
Вы можете использовать тот же трюк, который я дал, чтобы ответить на ваш другой вопрос: как установить ограничения на ось y закругленной фасетки?
dat <- data.table(dat)
dat[,y_min := y*0.5, by = group]
dat[,y_max:= y*1.5, by = group]
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line() +
facet_wrap(~group, ncol = 1, scales = "free_y") +
geom_blank(aes(y = y_min)) +
geom_blank(aes(y = y_max))
Для других, читающих этот вопрос, уловка состоит в том, чтобы явно создать y_min
а также y_max
переменные для каждой группы. И "заговорить" их через geom_blank()
, (На самом деле ничего не строится, но область построения каждого фасета корректируется на основе y_min
а также y_max
значения для этой группы).
Если по каким-то причинам вы хотите вручную указать минимальное и максимальное значения (вместо правила), ни одно из них не остановит вас. Но это утомительно
dat[group == "a",y_min := 0]
dat[group == "a",y_max := 30]
dat[group == "b",y_min := 0]
dat[group == "b",y_max := 3000]
ggplot(dat, aes(x = x, y = y)) +
geom_point() +
geom_line() +
facet_wrap(~group, ncol = 1, scales = "free_y") +
geom_blank(aes(y = y_min)) +
geom_blank(aes(y = y_max))
Но, как я уже говорил, это работает, если вы хотите расширить свои пределы, а не уменьшать их.