facet_zoom не может изменить разрывы увеличенного сюжета - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время у меня есть график, и я использовал facet_zoom, чтобы сосредоточиться на записях в диапазоне от 0 до 10 по оси x. Следующий код воспроизводит пример:

require(ggplot2)
require(ggforce)
require(dplyr)
x <- rnorm(10000, 50, 25)
y <- rexp(10000)
data <- data.frame(x, y)

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = dplyr::between(x, 0, 10))

Я хочу изменить разрывы на увеличенной части графика, чтобы они были эквивалентны:

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = dplyr::between(x, 0, 10)) +
  scale_x_continuous(breaks = seq(0,10,2))

Но это также меняет разрывы исходного сюжета. Можно ли просто изменить разрывы увеличенной части, оставив исходный график по умолчанию?

1 Ответ

0 голосов
/ 16 января 2019

Это работает для вашего варианта использования:

ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = between(x, 0, 10)) +
  scale_x_continuous(breaks = pretty)

plot

С ?scale_x_continuous, breaks примет следующее (выделение добавлено):

Один из:

  • NULL без перерывов
  • waiver() для разрывов по умолчанию, вычисленных объектом преобразования
  • Числовой вектор позиций
  • A функция , которая принимает пределы в качестве входных данных и возвращает разрывы в качестве выходных данных

pretty() - одна из таких функций. Он не предлагает очень точного контроля, но позволяет вам иметь некоторую свободу действий для определения разрывов между различными гранями с очень разными масштабами.

Для иллюстрации приведем два примера с различным желаемым количеством разрывов. См. ?pretty для более подробной информации о других аргументах, которые принимает эта функция.

p <- ggplot(data, aes(x = x, y = y)) +
  geom_point() +
  facet_zoom(x = between(x, 0, 10))

cowplot::plot_grid(
  p + scale_x_continuous(breaks = function(x) pretty(x, n = 3)),
  p + scale_x_continuous(breaks = function(x) pretty(x, n = 10)),
  labels = c("n = 3", "n = 10"),
  nrow = 1
)

more examples

Конечно, вы также можете определить свою собственную функцию для преобразования пределов графика в желаемые разрывы (например, что-то вроде p + scale_x_continuous(breaks = function(x) seq(min(x), max(x), length.out = 5))), но я обычно нахожу, что эти функции требуют более тонкой настройки, и pretty() часто хорошо достаточно.

...