在 ggplot 中创建具有给定最大和最小 x 值的平滑图
Create a smooth plot with given maximum and minumun x values in ggplot
我想在 ggplot 中创建一个绘图,显示潮汐系统在几天的时间跨度内的水位。我有每个高潮和低潮的水位,但是当我在 ggplot 中绘制它们时,线条看起来很前卫,我希望它看起来是弯曲的。我尝试使用 geom_smooth 但这行不通。有人知道吗?
+---------------+-------------+
| 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 |
+---------------+-------------+
平滑线的一种可能性是在每对点之间制作 sigmoid curve。由于您没有以易于复制的格式提供数据,让我们按如下方式制作一些模拟数据:
df <- data.frame(
x = 1:20,
y = rep(c(-1, 1), 10) * 1:20
)
ggplot(df, aes(x, y)) +
geom_line()
您可以按如下所示制作 S 形曲线:
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")
为了不误导人们使用您的图表,我建议将实际测量结果作为点包含在图表中。
您可以使用 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')
我想在 ggplot 中创建一个绘图,显示潮汐系统在几天的时间跨度内的水位。我有每个高潮和低潮的水位,但是当我在 ggplot 中绘制它们时,线条看起来很前卫,我希望它看起来是弯曲的。我尝试使用 geom_smooth 但这行不通。有人知道吗?
+---------------+-------------+
| 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 |
+---------------+-------------+
平滑线的一种可能性是在每对点之间制作 sigmoid curve。由于您没有以易于复制的格式提供数据,让我们按如下方式制作一些模拟数据:
df <- data.frame(
x = 1:20,
y = rep(c(-1, 1), 10) * 1:20
)
ggplot(df, aes(x, y)) +
geom_line()
您可以按如下所示制作 S 形曲线:
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")
为了不误导人们使用您的图表,我建议将实际测量结果作为点包含在图表中。
您可以使用 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')