Предположим, у меня есть данные, которые выглядят следующим образом:
library(tidyverse)
df <- tibble(x = c(0, 2, 5),
y = c(1000, 1, 1))
df |>
ggplot(aes(x,y)) +
geom_line()
Я хочу увеличить регион на основе значения x
. Но когда я пытаюсь использовать coord_cartesian
вот так
df |>
ggplot(aes(x,y)) +
geom_line() +
coord_cartesian(xlim = c(1.5, NA))
ось y
не регулируется автоматически. Это дает много пустого пространства, как это
Если я filter
соберу данные перед построением графика, я потеряю значимый диагональный сегмент. Это изображение должно быть сгенерировано автоматически, поэтому я не могу вручную указать ylim
в coord_cartesian
.
В моем приложении ось X — это дата, и я беру последние 6 месяцев. Расстояние между точками данных весьма изменчиво и непредсказуемо.
Возможный дубликат stackoverflow.com/q/67664661/680068 Похоже, нам нужно сделать некоторые предварительные расчеты.
Мне не известен какой-либо способ сделать это без каких-либо предварительных вычислений, но вот один из способов, который достаточно хорошо работает с вашими тестовыми данными. Подход, который я использую, заключается в определении значений y для наименьшего значения x, которое вам нужно на графике, и самого высокого значения x, которое вам не нужно. Затем вычислите «хорошую точку» где-то между ними и используйте ее как предел для оси Y.
Если ваши реальные данные не являются монотонными, вам, вероятно, придется более тщательно выбирать как верхние и нижние предположения для предела y, так и метод выбора «хорошего» промежуточного значения.
library(tidyverse)
df <- tibble(x = c(0, 2, 5),
y = c(1000, 1, 1))
df |>
ggplot(aes(x,y)) +
geom_line()
zoomPlot <- function(d, xLower, fudge = 0.5) {
yUpper <- d %>% filter(x < xLower) %>% head(1) %>% pull(y)
yLower <- d %>% filter(x >= xLower) %>% head(1) %>% pull(y)
yUpper <- round(yLower + (yUpper - yLower) * fudge, 0)
d |>
ggplot(aes(x,y)) +
geom_line() +
coord_cartesian(xlim = c(xLower, NA), ylim = c(NA, yUpper))
}
df %>% zoomPlot(1.5)
предоставление
Если график будет генерироваться автоматически, предположительно, «масштаб» по оси X также будет автоматическим. Как определяется масштаб?