Подтвердить что ты не робот

Как вы устанавливаете различные границы шкалы для разных граней?

Некоторые примеры данных:

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?"

4b9b3361

Ответ 1

Я не думаю, что это возможно в ggplot2. Этот обсуждение с января предполагает, что проблема находится на рассмотрении.

Ответ 2

Чтобы сжать шкалу на левом участке, удалите точки, находящиеся вне диапазона. Например. это уменьшит масштаб y на правом графике до значений от 0 до 0,5:

p <- ggplot(dfr, aes(x, y)) +   
     geom_point(subset=.(g == "a" | (y > 0 & y <.5))) +
     geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax)) +
     facet_wrap(~ g, scales = "free_y")

См. также мой ответ на этот question.