Установка индивидуальных ограничений по оси 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))

Но, как я уже говорил, это работает, если вы хотите расширить свои пределы, а не уменьшать их. введите описание изображения здесь

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