Создать гладкий график с заданными максимальным и минимальным значениями x в ggplot - PullRequest
0 голосов
/ 08 января 2020

Я хочу создать график в ggplot, показывающий уровень воды в приливной системе за промежуток времени в несколько дней. У меня есть уровни воды для каждого прилива и отлива, но когда я рисую их в ggplot, линия выглядит резкой, и мне бы хотелось, чтобы она выглядела пышной. Я пытался использовать geom_smooth, но это не сработает. У кого-нибудь есть идеи?

This is how it looks like

enter image description here

+---------------+-------------+ | Water.level_m | Time_h | +---------------+-------------+ | 3.9 | 0 | | 1.4 | 0.270833333 | | 3.8 | 0.516666667 | | 1.5 | 0.7875 | | 3.7 | 1.041666667 | | 1.7 | 1.308333333 | | 3.9 | 1.5625 | | 1.7 | 1.829166667 | | 3.6 | 2.091666667 | | 1.8 | 2.35 | | 3.8 | 2.608333333 | | 1.7 | 2.875 | | 3.6 | 3.141666667 | | 1.8 | 3.4 | | 3.9 | 3.654166667 | | 1.6 | 3.9375 | | 3.8 | 4.191666667 | | 1.6 | 4.454166667 | | 4.1 | 4.704166667 | | 1.3 | 4.9875 | | 4.2 | 5.245833333 | | 1.2 | 5.504166667 | | 4.4 | 5.75 | | 0.9 | 6.025 | | 4.5 | 6.275 | | 0.8 | 6.5375 | | 4.8 | 6.7875 | | 0.6 | 7.058333333 | | 4.8 | 7.308333333 | | 0.5 | 7.566666667 | | 5 | 7.816666667 | | 0.4 | 8.083333333 | | 5 | 8.3375 | | 0.2 | 8.6 | | 5.2 | 8.85 | | 0.2 | 9.108333333 | | 5.1 | 9.3625 | | 0.1 | 9.625 | | 5.2 | 9.879166667 | | 0.2 | 10.14166667 | | 5.1 | 10.39166667 | +---------------+-------------+

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Вы можете использовать spline() для интерполяции исходных точек данных:

df <- data.frame(
  x = 1:20,
  y = rep(c(-1, 1), 10) * 1:20
)

ggplot(df, aes(x, y)) +
  geom_line() +
  geom_line(data = as.data.frame(spline(df, n = 300, method = 'natural')), aes(x = x, y = y), color = 'red')

enter image description here

0 голосов
/ 08 января 2020

Одна из возможностей сглаживания линии - сделать сигмовидную кривую между каждой парой точек. Поскольку вы не предоставили данные в формате, который легко скопировать, давайте составим некоторые фиктивные данные следующим образом:

df <- data.frame(
  x = 1:20,
  y = rep(c(-1, 1), 10) * 1:20
)

ggplot(df, aes(x, y)) +
  geom_line()

enter image description here

Из этого вы можете сделать сигмовидную кривую следующим образом:

sigmoid <- cbind(head(df, -1), tail(df, -1))
names(sigmoid)[3:4] <- c("xend", "yend")

sigmoid <- apply(sigmoid, 1, function(dat) {
  x <- seq(dat[["x"]], dat[["xend"]], length.out = 10)
  A <- dat[["y"]]
  K <- dat[["yend"]]
  B <- 10
  C <- 1
  mid <- mean(c(dat[["x"]], dat[["xend"]]))
  y <- A + (K - A) / (C + exp(-B * (x - mid)))
  data.frame(x = x, y = y)
})

sigmoid <- do.call(rbind, sigmoid)

Не стесняйтесь изменять параметры B и C в соответствии с вашими данными. Взгляните на связанную страницу википедии выше для объяснения параметров.

Теперь график будет выглядеть следующим образом в сочетании с входными данными:

ggplot(df, aes(x, y)) +
  geom_line() +
  geom_line(data = sigmoid, colour = "red")

enter image description here

Чтобы не сбивать людей с вашего графика, я рекомендую включать фактические измерения в виде точек на графике.

...