Perhaps I am missing your point but I do not see any problem with the y scale in your example. I modified the code to put everything on one plot and show both the data points and the fit lines. With 8 data points in tibexp the fit is a curved line bowing downwards. With 2 data points in tibexp2, the fit is a straight line which is always above the first spline fit except at the end points where they meet. I have plotted the data twice, once with the full scale and a second time adjusting the scale with coord_cartesian.
require(ggplot2)
#> Loading required package: ggplot2
require(magrittr)
#> Loading required package: magrittr
require(dplyr)
#> Loading required package: dplyr
icexp=10
slexp=8
spdexp = 1:8 * .1 - .7
tibexp<-tibble(spdexp,icexp,slexp)
tibexp %<>% mutate(expexp = exp(slexp * spdexp + icexp)/1000) %>%
select(-slexp,-icexp)
Spl <- as.data.frame(spline(tibexp$spdexp,tibexp$expexp))
tibpnt<-tibble(x=-.05,y=15)
spdexp = 1:2 * .1 - .2
tibexp2 <- tibble(spdexp,icexp,slexp)
tibexp2 %<>% mutate(expexp = exp(slexp * spdexp + icexp)/1000) %>%
select(-slexp,-icexp)
Spl2<- as.data.frame(spline(tibexp2$spdexp,tibexp2$expexp))
ggplot() +
geom_point(data=tibpnt, aes(x=x, y=y),shape=21, alpha=1, size =10) +
theme_bw() +
geom_point(data=tibexp,aes(x=spdexp,y=expexp),color="red",size=4,alpha=.3) +
geom_point(data=tibexp2,aes(x=spdexp,y=expexp),color="blue",size=4,alpha=.3) +
geom_line(data=Spl,aes(x=x,y=y),color="red",size=4,alpha=.3) +
geom_line(data=Spl2,aes(x=x,y=y),color="blue",size=4,alpha=.3)

ggplot() +
geom_point(data=tibpnt, aes(x=x, y=y),shape=21, alpha=1, size =10) +
theme_bw() +
geom_point(data=tibexp,aes(x=spdexp,y=expexp),color="red",size=4,alpha=.3) +
geom_point(data=tibexp2,aes(x=spdexp,y=expexp),color="blue",size=4,alpha=.3) +
geom_line(data=Spl,aes(x=x,y=y),color="red",size=4,alpha=.3) +
geom_line(data=Spl2,aes(x=x,y=y),color="blue",size=4,alpha=.3) +
coord_cartesian(xlim = c(-0.1, 0), ylim = c(9, 23))

Created on 2019-07-06 by the reprex package (v0.2.1)